用sscanf判断ip地址的正确性

由于看到那个遍历字符串去逐个判断的代码就觉得不简洁,虽然c语言中没有脚本语言那么爽,但是好歹还有一个sscanf吧。所以写了个小函数

 

<textarea cols="50" rows="15" name="code" class="cpp">#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; /*该函数能够验证合法的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",&amp;part1,&amp;part2,&amp;part3,&amp;part4,&amp;tail); if(field&lt;4|| field&gt;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&gt;=0 &amp;&amp; part1&lt;=255) &amp;&amp; (part2&gt;=0 &amp;&amp; part2&lt;=255) &amp;&amp; (part3&gt;=0 &amp;&amp; part3&lt;=255) &amp;&amp; (part4&gt;=0 &amp;&amp; part4&lt;=255) ) { if(pAddr) *pAddr= part4&lt;&lt;24 | part3&lt;&lt;16 | part2&lt;&lt;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,&amp;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> 

你可能感兴趣的:(c,网络,脚本,null,语言)