如何用C語言判斷ip地址是否合法? (用inet_addr有問題)
阿新 • • 發佈:2019-01-27
對ip地址進行判斷, 可以用很多方法, 比如正則表示式和直接解析法。 但是, 並不是所有的朋友都會正則表示式, 直接解析法則繁瑣易錯。 下面, 我們換一個思路, 看看如何判斷ip地址的合法性(其實這個程式有問題):
#include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") int isValidIP(char *ip) { if(INADDR_NONE == inet_addr(ip)) { return -1; } return 1; } int main() { char ips[][100] = { "123.456.789.1", "116.1.1.29", "119.x.1.11", "172.18.18.29", "-1.1.1.1", "0.0.0.0", "255.255.255.255", "10.85.168.40", "256.1.1.1", "127.0.0.1", "1.1. 1.1", "190.190.190.190", "1.1.1", // 這個被誤判為合法的了 "119.1.1.1", "" // 這個被誤判為合法的了 }; int size = sizeof(ips) / sizeof(ips[0]); int i = 0; for(i = 0; i < size; i++) { if(-1 == isValidIP(ips[i])) { printf("no\n"); } else { printf("yes\n"); } } return 0; }
結果:
123.456.789.1--->no
116.1.1.29--->yes
119.x.1.11--->no
172.18.18.29--->yes
-1.1.1.1--->no
0.0.0.0--->yes
255.255.255.255--->no
10.85.168.40--->yes
256.1.1.1--->no
127.0.0.1--->yes
1.1. 1.1--->no
190.190.190.190--->yes
1.1.1--->yes
119.1.1.1--->yes
--->yes
可以看到, 上述程式是有問題的,那怎麼辦呢? 我們先判斷一下字串中的點的數目嗎? 即便如此, 我們怎麼知道不存在其他問題呢? 我以前以為inet_addr是判斷ip是否合法的好方法, 沒想到存在問題。
所以, 還是老實一點, 用sscanf吧。 如果大家如果大家有好的方法, 歡迎分享。