我正在寻找一些函数来验证如果给定的字符串是有效的ipv4地址, 但是inet_aton()似乎对“11”和“1.1”等字符串感到满意 什么是验证ipv4字符串的最佳方法。
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
struct in_addr addr;
if (argc != 2) {
fprintf(stderr, "%s <dotted-address>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (inet_aton(argv[1], &addr) == 0) {
fprintf(stderr, "Invalid address\n");
exit(EXIT_FAILURE);
}
printf("%s\n", inet_ntoa(addr));
exit(EXIT_SUCCESS);
}
某些无效字符串的输出
[root@ ~]# ./a.out 1.1
1.0.0.1
[root@ ~]# ./a.out "1 some junk"
0.0.0.1
[root@ ~]# ./a.out "10 some junk"
0.0.0.10
我希望例程拒绝任何不带点分十进制表示法的字符串 x.x.x.x,x从0到255
答案 0 :(得分:3)
这是inet_aton
的指定/记录行为。
如果您只想接受点分四位十进制表示法,请使用:
unsigned char *a = (void *)&addr, dummy;
if (sscanf(src, "%3hhd.%3hhd.%3hhd.%3hhd%c", a, a+1, a+2, a+3, &dummy)!=4) {
/* error */
}
或者,您可以使用inet_pton
函数,该函数在其接受的格式中更具限制性。