笔试题目“检测IPv4地址”的实现
2012-05-18 10:54
211 查看
网友的力量是强大的,昨天发了一篇Post,关于一道面试/笔试题。得到网友们的众多解决方法。我不得不承认自己写的代码是如此的烂。尽管如此,也是很有必要和大家一起来探讨,也有必要写出自己心中所想。这样才有进步,才有改变,才能将自己的烂代码优化。接着发一段烂代码,希望学习网友们更加优美,优秀的代码。
判断一个字符串是否是IPv4地址。如果是返回ture,否则返回false。同样不可以使用库函数。可以选择用C/C++,C#或者Java。
e.g. C/C++: bool checkIPv4(char * ip){}
一开始我是这样写的。
检查IPv4
但是很明显是有问题的。
当检验“192.168.203.70”的时候,结果是可以的。
但是当检验的对象不是数字的时候,例如“a.168.203.70”,居然也可以验证通过,欠考虑了。
所以在切割出来的每个整型,我再检查了一遍每个整型是否在0~9范围内,不是的话返回false。
感谢网友zdd的提醒,确实没有考虑到类型“1...3”出现连续点的情况。果然自己写的东西够烂的。我是这样处理的:
出现这样的情况是因为
里面的for循环会发生不执行的情况,所以就不处理类似“1...3”出现连续点的情况了。我改变代码如下
将x放在for循环外面,用来检测是否出现连续个点的情况。
解释应该挺清楚的了。这个时候只要切割出来的字符不在0~9范围内,都不会通过。
相信有更好的解决方法,求共勉之。。。。
笔试题目
判断一个字符串是否是IPv4地址。如果是返回ture,否则返回false。同样不可以使用库函数。可以选择用C/C++,C#或者Java。
e.g. C/C++: bool checkIPv4(char * ip){}
解决方法
鄙人是这样想的,按照‘.’先将每个字串分割出来。如“192.168.203.70”分割为192,168,203,70四个整型。然后再判断这四个整型的范围,是否在0~255之间。我总觉得这种考虑欠妥,应该选择类似正则表达式那样的方法吧。但是不会写。。。一开始我是这样写的。
检查IPv4
#include <stdio.h> bool checkIpv4(char * ip) { char *p=ip; char *q=ip; char *c; int i=0,s,count=0; if(*p=='.') //处理特殊情况 return false; while(*p!='\0') { if(*p=='.'||*(p+1)=='\0') //根据'.'将字符串切割出来 { count++; //计算切割的字串个数 if(*(p+1)=='\0') //处理最后一个字串 { i++; q=p; } else q=p-1; s=0; for(int j=1;j<=i;j++) //将切割出来的字串变成整型 { int x=*q-'0'; //字符减'0'变为整型 for(int k=1;k<j;k++) x*=10; s+=x; q--; } printf("%d\n",s); if(s<0||s>255) //判断切割出来的字串是否在ipv4范围内 return false; i=0; } else { i++; } p++; } if(count==4) return true; else return false; } int main(void) { char ip[]="a.v.0.0"; if(checkIpv4(ip)) printf("该地址是IPv4地址\n"); else printf("该地址不是IPv4地址\n"); return 0; }
但是很明显是有问题的。
当检验“192.168.203.70”的时候,结果是可以的。
但是当检验的对象不是数字的时候,例如“a.168.203.70”,居然也可以验证通过,欠考虑了。
所以在切割出来的每个整型,我再检查了一遍每个整型是否在0~9范围内,不是的话返回false。
if(x<0||x>9) //判断x是否在0~9之间 return false;
感谢网友zdd的提醒,确实没有考虑到类型“1...3”出现连续点的情况。果然自己写的东西够烂的。我是这样处理的:
出现这样的情况是因为
s=0; for(int j=1;j<=i;j++) //将切割出来的字串变成整型 { int x=*q-'0'; //字符减'0'变为整型 if(x<0||x>9) //判断x是否在0~9之间 return false; for(int k=1;k<j;k++) //第几位乘以几-1个10. x*=10; s+=x; q--; }
里面的for循环会发生不执行的情况,所以就不处理类似“1...3”出现连续点的情况了。我改变代码如下
s=0; int x=-1; for(int j=1;j<=i;j++) //将切割出来的字串变成整型 { x=*q-'0'; //字符减'0'变为整型 if(x<0||x>9) //判断x是否在0~9之间 return false; for(int k=1;k<j;k++) //第几位乘以几-1个10. x*=10; s+=x; q--; } if(x==-1) return false;//防止类型“1...3”出现连续点的情况
将x放在for循环外面,用来检测是否出现连续个点的情况。
下面是完整的代码
#include <stdio.h> bool checkIpv4(char * ip) { printf("检验对象是:%s\n",ip); char *p=ip; //遍历指针 char *q=ip; //字串指针 int i=0,s,count=0; //i是每个字串的长度,s是字串转化为的整型,count是字串的个数 if(*p=='.') //处理特殊情况 return false; while(*p!='\0') //遍历每个字符 { if(*p=='.'||*(p+1)=='\0') //根据'.'将字符串切割出来,最后一个字串根据'\0'识别 { count++; //计算切割的字串个数 if(*(p+1)=='\0') //处理最后一个字串,‘\0’识别的时候 { i++; q=p; } else q=p-1; //‘.切割’ s=0; int x=-1; for(int j=1;j<=i;j++) //将切割出来的字串变成整型 { x=*q-'0'; //字符减'0'变为整型 if(x<0||x>9) //判断x是否在0~9之间 return false; for(int k=1;k<j;k++) //第几位乘以几-1个10. x*=10; s+=x; q--; } if(x==-1) return false;//防止类型“1...3”出现连续点的情况 printf("%d\n",s); if(s<0||s>255) //判断切割出来的字串是否在ipv4范围内 return false; i=0; } else { i++; } p++; } if(count==4) //检查是否是四个字串 return true; else return false; } int main(void) { char ip[]="1..2.3"; if(checkIpv4(ip)) printf("该地址是IPv4地址\n"); else printf("该地址不是IPv4地址\n"); return 0; }
解释应该挺清楚的了。这个时候只要切割出来的字符不在0~9范围内,都不会通过。
相信有更好的解决方法,求共勉之。。。。
相关文章推荐
- 一个笔试题目(实现大小端的相互转换,只针对32位的int类型)
- C语言字符串库函数的实现也是笔试题常考的题目,以下代码没有严格测试,只是简单的实现:
- 笔试题目“翻转字符串”的实现
- 笔试题目“翻转字符串”的实现
- 阿里实习生笔试程序检测题目
- 笔试题目“翻转字符串”的实现
- Python笔试题目:求最大的K个数子,解法一,最快速实现的方法
- 常见笔试题目之函数实现
- 360笔试题目-HashMap实现
- 深圳同城快跑笔试题目 2 实现json字符串保存到本地硬盘
- Java单态模式的实现(笔试不会的题目,鄙视自己一下)
- 快速排序的非递归实现 -- 人人网2014笔试题目
- 百度前端笔试题目--css 实现一个带尖角的正方形
- 深圳同城快跑笔试题目 3 实现四则运算
- 阿里巴巴校招2017前端笔试题目 -- 原生js/html5 实现一个路由
- 一道Baidu笔试题目的解(+1实现-1)
- 360笔试题目-HashMap实现
- 京东2017实习校招笔试题目-异或实现
- 迅雷笔试题的Utf-8编码检测的实现
- 华为的一道笔试题目:栈的实现