IP地址匹配
来源:互联网 发布:骑行头盔推荐 知乎 编辑:程序博客网 时间:2024/06/02 03:01
一、如何提高编程能力?
1.对于简单问题:例如排序、查找,约瑟夫环、回文数、素数、润年,单向链表创建、删除、插入、查找、逆序,子字符串查找、系统字符处理函数的自己编写等;这部分严格要求自己,不需要机器调试、能够在纸质上写出,并能保证程序健壮性和尽可能的提高效率(包括内存使用率和性能)。
2.对于牵扯到工程问题:在常用IDE包括vc6.0,Linux下的gcc(vc6.0的c语法和规则可能更苛刻)等环境下,能迅速高效的完成。
二、以下是一道工程问题,做的可能还不到位
1.gcc//IP地址最大前缀匹配#include <string.h>#include <stdio.h>int main(){ printf("please input : IP,num,IPandMask list\n"); ////////////////////////////////////////////////// char* ipaddr = (char *)malloc(50); scanf("%s",ipaddr); char *p = NULL; int ip[4]; int i = 0; p = strtok(ipaddr,"."); while(p){ ip[i] = atoi(p); i++; p = strtok(NULL,"."); } if(i < 3 ){ printf("error\n"); return -1; } ////////////////////////////////////////////////// int num; scanf("%d",&num); if(num <=0 ) return -1; char iplist[num][50]; int k = 0; for(k = 0;k<num;k++){ scanf("%s",iplist[k]); } /////////////////////////////////////////////////// int listip[num][4]; int listmask[num][4]; for(k=0;k<num;k++){ char* tmp = (char*) malloc(50); strcpy(tmp,iplist[k]); int i = 0; p = iplist[k]; if(p!= NULL) p = strtok(iplist[k],"."); while(p){ if(p!=NULL) listip[k][i] = atoi(p); i++; if(i == 3){ if(p!=NULL) p = strtok(NULL,"/"); if(p!=NULL) listip[k][i] = atoi(p); break; } if(p!=NULL) p = strtok(NULL,"."); } if(i < 3){ printf("error\n"); return -1; } p = strtok(tmp,"/"); if(p == NULL) return -1; p = strtok(NULL,"."); i = 0; while(p){ if(p!=NULL) listmask[k][i] = atoi(p); i++; if(p!=NULL) p = strtok(NULL,"."); } if(i < 3) return -1; } ////////////////////////////////////////////////////////// //int listip[num][4]; int listmask[num][4]; //int ip[4]; int result[num]; int j = 0; for(k=0;k<num;k++){ result[k] = 0; for(j=0;j<4;j++){ if((ip[j]&listmask[k][j]) != listip[k][j]){ result[k] = -1; break; } } if(result[k] == -1) continue; for(j=0;j<4;j++){ int tmpip = ip[j]; int tmplistip = listip[k][j]; int tmp = 128; for(tmp=128;tmp!=0;tmp=tmp/2){ if((tmpip/tmp) == (tmplistip/tmp)){ result[k]++; tmpip = tmpip%tmp; tmplistip = tmplistip%tmp; } else break; } } } /////////////////////////// int res = 0; for(k=0;k<num;k++){ if(res<=result[k]) res = result[k]; } printf("res is %d\n",res); return res; }
2.vc6.0——要求变量定义在所有函数使用之前!
//IP地址最大前缀匹配#include <string.h>#include <stdio.h>#include <stdlib.h>char* ipaddr;int main(){ //printf("please input : IP,num,IPandMask list\n"); ////////////////////////////////////////////////// char* ipaddr = (char*)malloc(50); char *p = NULL; int ip[4]; int i = 0; int num; char iplist[50][50]; int listip[50][4]; int listmask[50][4]; int k = 0; int result[50]; int j = 0; int res = 0; scanf("%s",ipaddr); p = strtok(ipaddr,"."); while(p){ ip[i] = atoi(p); i++; p = strtok(NULL,"."); } if(i < 3 ){ printf("error\n"); return -1; } ////////////////////////////////////////////////// scanf("%d",&num); if(num <=0 ) return -1; for(k = 0;k<num;k++){ scanf("%s",iplist[k]); } /////////////////////////////////////////////////// for(k=0;k<num;k++){ char* tmp = (char*) malloc(50); strcpy(tmp,iplist[k]); i = 0; p = iplist[k]; if(p!= NULL) p = strtok(iplist[k],"."); while(p){ if(p!=NULL) listip[k][i] = atoi(p); i++; if(i == 3){ if(p!=NULL) p = strtok(NULL,"/"); if(p!=NULL) listip[k][i] = atoi(p); break; } if(p!=NULL) p = strtok(NULL,"."); } if(i < 3){ printf("error\n"); return -1; } p = strtok(tmp,"/"); if(p == NULL) return -1; p = strtok(NULL,"."); i = 0; while(p){ if(p!=NULL) listmask[k][i] = atoi(p); i++; if(p!=NULL) p = strtok(NULL,"."); } if(i < 3) return -1; } ////////////////////////////////////////////////////////// //int listip[num][4]; int listmask[num][4]; //int ip[4]; for(k=0;k<num;k++){ result[k] = 0; for(j=0;j<4;j++){ if((ip[j]&listmask[k][j]) != listip[k][j]){ result[k] = -1; break; } } if(result[k] == -1) continue; for(j=0;j<4;j++){ int tmpip = ip[j]; int tmplistip = listip[k][j]; int tmp = 128; for(tmp=128;tmp!=0;tmp=tmp/2){ if((tmpip/tmp) == (tmplistip/tmp)){ result[k]++; tmpip = tmpip%tmp; tmplistip = tmplistip%tmp; } else break; } } } /////////////////////////// for(k=0;k<num;k++){ if(res<=result[k]) res = result[k]; } printf("res is %d\n",res); return res; }
3.测试
192.168.1.1004192.168.1.128/255.255.255.192192.168.1.0/255.255.255.0192.168.1.64/255.255.255.1920.0.0.0/0.0.0.0
结果:
26
三、其他解法
网上有朋友使用了ssanf和sprint等格式化输入/输出函数,将字符串查找部分简化:
http://blog.csdn.net/wangshihui512/article/details/8850418
0 0
- 匹配IP地址
- IP地址匹配
- IP地址匹配方式
- python匹配ip地址
- JavaScript匹配ip地址
- 正则表达式匹配ip地址
- 正则表达式匹配IP地址
- JAVA正则匹配 IP地址
- linux下匹配ip地址
- IP地址正则匹配解析
- 一个匹配IP地址的正则表达式
- java匹配IP地址正则表达式
- 使用正则表达式匹配ip地址是否合法
- 正则式简单匹配ip地址
- Java正则表达式匹配IP地址
- 正则表达式应用:匹配IP地址
- javascript正则表达式模糊匹配IP地址
- 匹配IP地址的正则表达式实例
- DM8168裸机调试-GPMC+FPGA
- nginx服务器access_log日志分析及配置详解
- [LeetCode] Maximum Depth of Binary Tree
- 【Hibernate步步为营】--双向关联一对一映射详解(二)
- android Linearlayout中有关gravity与layout_gravity对布局的影响
- IP地址匹配
- cvAddWeighted( ) (转载)
- WebView调用JS失败
- Ubuntu 12.04.04 LTS server版本DHCP配置
- cvFindContours函数使用-转载
- 用CMD命令查看局域网电脑IP地址,电脑名称及MAC地址
- 浅析变量的作用域和生存周期的区别
- uvaoj 10474 Where is the Marble?
- VS2010下调试activex控件