在C中使用regexps

时间:2014-09-26 23:17:56

标签: c regex string

所以我有一个IP地址可以这样说:100.50.23.56

我希望能够提取100,50,23,56,并将它们全部加在一起并将其存储在一个新变量中。

ip地址以字符串形式出现。

所以我假设我必须使用正则表达式。但我不知道该怎么做。

有人可以给我一个简单的例子吗?

感谢。

2 个答案:

答案 0 :(得分:1)

虽然您可以使用压路机来破解核桃,但通常认为这样做太过分了。同上,正则表达式为手头的工作。您可以相当有效地使用strtol()(每组数字一次)。您也可以非常有效地使用sscanf()

int ip[4];
if (sscanf("100.50.23.56", "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]) != 4)
    ...report problem and do not continue...
int sum = ip[0] + ip[1] + ip[2] + ip[3];

您可以使用4个单独的变量而不是数组;这段代码使用数组并没有太大的好处(如果有的话)。

char *end;
char *begin = "100.50.23.56";
int sum = 0;
long part;
for (int i = 0; i < 4; i++)
{
    if (((part = strtol(begin, &end, 10)) == 0 && begin == end) ||
        (part < 0 || part > 255))
        ...report problem and return...
    sum += part;
    if (*end != '\0')
        end++;
    begin = end;
}

警告 未经测试的代码。

请注意,这两个解决方案都允许在数字之前留出空格,并且不关心尾随垃圾,因此它们都会解析" 100. 50. 23. 56 and counting"。收紧代码来处理这种格式错误的IPv4地址是完全可行的,但并不像显示的代码那么简单。

另请注意,如果您尝试生成用于网络功能的IP地址,则可以使用专门用于将字符串转换为IP地址的功能做得更好。但是,提取IPv4地址的组件有点凌乱(比特屏蔽和移位 - 并不是那么难),这就是我选择不在这里做的原因。

答案 1 :(得分:0)

没有错误检查,这只需要少量代码行。错误检查会增加一些,但它仍然很简单,不需要像正则表达式那样的重量级机器。

#include <string.h>
#include <stdio.h>

void parse_ip(unsigned char ip[4], const char *s) {
    memset(ip, 0, 4);
    for (; *s; s++) {
        if (*s == '.') ip++;
        else *ip = *ip * 10 + *s - '0';
    }
}

int main(int argc, char **argv) {
    unsigned char ip[4];
    parse_ip(ip, "100.50.23.56");
    printf("%d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
    return 0;
}