0%

C判断字符串IP有效性

如题

  1. 直接读取字符串进行对比

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int 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;
    }
  2. 使用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;
    }
  3. 使用正则

    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(&reg, pattern, cflags);
    status = regexec(&reg, ip_str, 1, pmatch, 0);
    if (status == REG_NOMATCH) {
    return 0;
    } else if (status == 0) {
    return 1;
    }
    regfree(&reg);
    return 0;
    }

参考资料

  1. C判断一字符串是否是合法的IP地址