判断字符串是否为合法ip

来源:互联网 发布:plsql导入数据和表结构 编辑:程序博客网 时间:2024/05/21 15:43

周三去B商搜面试,连着面了三面,对体力也是一个不小的考验,三面也是技术面,其中代码题为判断字符串是否为合法IP

之前IP的题写过32位int转换为IP的,还好数字串判断是否能成为IP的DFS,字符串判断IP的还没遇见过

经过思考之后,先确定方向,是一道字符串处理的题,合法ip的话主要有以下几点:

1.合法IP只有'.'和'1-9'其他的字符都干掉

2.IP串为四个数字3个'.'不符合的干掉

3.连续的'..'干掉

4.数字在0-255以外的干掉

5.非0数字前有0的也干掉


然后开始手写,之前写的时候没考虑到010的情况,后来发现了加了一个逻辑判断,总的来说思路没啥问题,附上代码:

bool isValidIP(char* str){if (NULL==str){return false;}bool preIsNum=false;int numOfPoint=0;int numOfNum=0;char *p=str;while ('\0'!=*p&&numOfPoint<=3&&numOfNum<=4){if('.'!=*p&&(*p<'0'||*p>'9')){return false;}if('.'==*p){ if (!preIsNum) { return false; } else { preIsNum=false; numOfPoint++; } p++;}else{int tmp=0;bool prevHasZero=0;while ('\0'!=*p&&*p>='0'&&*p<='9'){if (prevHasZero==true){return false;}if (*p=='0'&&tmp==0){ prevHasZero=true;}tmp=tmp*10+(*p-'0');p++;}if (tmp<0||tmp>255){return false;}numOfNum++;preIsNum=true;}}if (numOfPoint==3&&numOfNum==4){return true;}else{return false;}}

附上检查代码和结果:



int main(){char a[][10] ={"0","000000"};char *b[] ={"","a","000","0.123.456.2","000.000.0.0",".0.0.3.2",".0.0.0.0","1.1.256.1","1.2.a.2","00.0.0.0","0.00.0.0","010.010.010.010"};char *c[] ={"0.0.0.0","1.1.1.1","100.100.100.100","255.255.255.255"} ;ofstream outfile;outfile.open("out.txt");cout<<setw(20)<< setiosflags(ios::left)<<"无效IP"<<setw(20)<<"判断结果"<<endl;outfile<<setw(20)<< setiosflags(ios::left)<<"无效IP"<<setw(20)<<"判断结果"<<endl;for (int i=0;i<sizeof(b)/sizeof(b[0]);i++){cout<<setw(20)<< setiosflags(ios::left)<<b[i]<<setw(20)<<isValidIP(b[i])<<endl;outfile<<setw(20)<< setiosflags(ios::left)<<b[i]<<setw(20)<<isValidIP(b[i])<<endl;}cout<<setw(20)<< setiosflags(ios::left)<<"有效IP"<<setw(20)<<"判断结果"<<endl;outfile<<setw(20)<< setiosflags(ios::left)<<"有效IP"<<setw(20)<<"判断结果"<<endl;for (int i=0;i<sizeof(c)/sizeof(c[0]);i++){cout<<setw(20)<< setiosflags(ios::left)<<c[i]<<setw(20)<<isValidIP(c[i])<<endl;outfile<<setw(20)<< setiosflags(ios::left)<<c[i]<<setw(20)<<isValidIP(c[i])<<endl;}outfile.close();}


0 0
原创粉丝点击