C++ inet_aton()返回无效ip地址的成功?

C++ inet_aton()返回无效ip地址的成功?,c++,c,linux,gcc,ip,C++,C,Linux,Gcc,Ip,我正在寻找一些函数来验证给定的字符串是否是有效的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) {

我正在寻找一些函数来验证给定的字符串是否是有效的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);
}
我想要一个例程来拒绝任何不使用点十进制表示法的字符串
x、 x.x.x,x从0到255

这是
inet\u 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\u pton
函数,该函数在其接受的格式方面更具限制性。

您可以查看此帖子以验证ipv4字符串
1.1
是一个有效的ip4地址,这意味着
1.0.0.1
inet\u aton的行为如其主页@Ozan Thank中所述,MM的“1”和“1 abc”是否也有效?
unsigned char *a = (void *)&addr, dummy;
if (sscanf(src, "%3hhd.%3hhd.%3hhd.%3hhd%c", a, a+1, a+2, a+3, &dummy)!=4) {
    /* error */
}