由于看到那个遍历字符串去逐个判断的代码就觉得不简洁,虽然c语言中没有脚本语言那么爽,但是好歹还有一个sscanf吧。所以写了个小函数
<textarea cols="50" rows="15" name="code" class="cpp">#include <stdio.h> #include <stdlib.h> /*该函数能够验证合法的ip地址,ip地址中可以有前导0,也可以有空格*/ int isValidStr(char *buf,int *pAddr) { int part1,part2,part3,part4; char tail=0; int field; if(buf==NULL) { return 0; } field=sscanf(buf,"%d . %d . %d . %d %c",&part1,&part2,&part3,&part4,&tail); if(field<4|| field>5) { printf("expect 4 field,get %d/n",field); return 0; } if(tail!=0) { printf("ip address mixed with non number/n"); return 0; } if( (part1>=0 && part1<=255) && (part2>=0 && part2<=255) && (part3>=0 && part3<=255) && (part4>=0 && part4<=255) ) { if(pAddr) *pAddr= part4<<24 | part3<<16 | part2<<8 | part1;/*转换成网络序*/ return 1; } else { printf("not good ip %d:%d:%d:%d/n",part1,part2,part3,part4); } return 0; } int testip(char *buf,int expect) { int result=0; int addr=0; result=isValidStr(buf,&addr); if(result==expect) { printf("OK:valid ip %s,expect %d,get %d/n",buf,expect,result); if(expect==1) { printf("/twe convert %s to 0x%x/n",buf,addr); } } else { printf("ERROR:valid ip %s,expect %d,get %d/n",buf,expect,result); } return 0; } int main (int argc, char const* argv[]) { /*空ip*/ testip(NULL,0); /*正常ip*/ testip("10.129.43.244",1); /*带空格的ip*/ testip(" 10.129.43.244",1); testip("10 .129 .43.244 ",1); /*带前导0的ip*/ testip("010.129.043.244",1); testip("010.0129.043.0244",1); /*在前面带非法字符的ip*/ testip("x10.129.43.244",0); /*最后带非法字符的ip*/ testip("10.129.43.24y",0); testip("10.129.43.y",0); return 0; } </textarea>