所以我有一个IP地址可以这样说:100.50.23.56
我希望能够提取100,50,23,56,并将它们全部加在一起并将其存储在一个新变量中。
ip地址以字符串形式出现。
所以我假设我必须使用正则表达式。但我不知道该怎么做。
有人可以给我一个简单的例子吗?
感谢。
答案 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;
}