如题
直接读取字符串进行对比
1
2
3
4
5
6
7
8
9
10
11
12int is_valid_ip_comp(const char *ip_str) {
u_int32_t p1, p2, p3, p4;
if (sscanf(ip_str, "%u.%u.%u.%u", &p1, &p2, &p3, &p4) != 4)
return 0;
if (p1 <= 255 && p2 <= 255 && p3 <= 255 && p4 <= 255) {
char tmp[64];
sprintf(tmp, "%u.%u.%u.%u", p1, p2, p3, p4);
return !strcmp(tmp, ip_str);
}
return 0;
}使用inet_pton()
1
2
3
4
5
6
7
8
9
10#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ctype.h>
int is_valid_ip_inet(const char *ip_str) {
struct sockaddr_in sa;
int result = inet_pton(AF_INET, ip_str, &(sa.sin_addr));
return result;
}使用正则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <regex.h>
#include <sys/types.h>
int is_valid_ip_reg(const char *ip_str) {
int status, i;
int cflags = REG_EXTENDED;
regmatch_t pmatch[1];
regex_t reg;
const char *pattern = "^([0-9]|[1-9][0-9]|1[0-9]{1,2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{1,2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{1,2}|2[0-4][0-9]|25[0-5]).([0-9]|[1-9][0-9]|1[0-9]{1,2}|2[0-4][0-9]|25[0-5])$";
regcomp(®, pattern, cflags);
status = regexec(®, ip_str, 1, pmatch, 0);
if (status == REG_NOMATCH) {
return 0;
} else if (status == 0) {
return 1;
}
regfree(®);
return 0;
}
参考资料