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);
}

いくつかの無効な文字列の出力は

[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

ドット付き 10 進表記 xxxx、x が 0 から 255 でない文字列を拒否するルーチンが必要です。

4

1 に答える 1

3

これは、 の指定/文書化された動作ですinet_aton

ドット付き 4 進数表記のみを受け入れたい場合は、次を使用します。

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または、受け入れる形式がより制限されている関数を使用することもできます。

于 2013-05-01T22:06:49.213 に答える