我需要在C语言中解析这个字符串:
XFR 3 NS 207.46.106.118:1863 0 207.46.104.20:1863\r\n
能够获取字符串中的207.46.106.118
部分和1863
部分(即第一个IP地址)。
我知道可以逐个字符地查找并最终找到这些信息,但是如果字符串中的IP地址格式发生变化(数字位数减少),有没有更简单的方法来获取这些信息呢?
我需要在C语言中解析这个字符串:
XFR 3 NS 207.46.106.118:1863 0 207.46.104.20:1863\r\n
能够获取字符串中的207.46.106.118
部分和1863
部分(即第一个IP地址)。
我知道可以逐个字符地查找并最终找到这些信息,但是如果字符串中的IP地址格式发生变化(数字位数减少),有没有更简单的方法来获取这些信息呢?
你可以使用来自C标准库的sscanf()
函数。这里是一个获取IP和端口字符串的示例,假设地址前面的部分是固定的:
#include <stdio.h>
int main(void)
{
const char *input = "XFR 3 NS 207.46.106.118:1863 0 207.46.104.20:1863\r\n";
const char *format = "XFR 3 NS %15[0-9.]:%5[0-9]";
char ip[16] = { 0 }; // ip4 addresses have max len 15
char port[6] = { 0 }; // port numbers are 16bit, ie 5 digits max
if(sscanf(input, format, ip, port) != 2)
puts("parsing failed");
else printf("ip = %s\nport = %s\n", ip, port);
return 0;
}
格式字符串的重要部分是扫描集模式%15[0-9.]
和%5[0-9]
,它们将匹配由数字或点组成的最多15个字符的字符串(即IP地址不会被检查其格式是否正确),以及最多5位数字的字符串(这意味着无效的端口号超过2^16-1将会通过)。
取决于定义文档格式的内容。在这种情况下,可能只需要将字符串分词并查找所需内容。只需使用strtok
并在空格上拆分以获取207.46.106.118:1863
,然后您可以再次进行分词(或手动扫描:
)以获得正确的组件。
strtok
函数以空格为分隔符进行标记化,或者可以使用scanf
家族中的一个来提取数据。这可能过于复杂,因为您说您不想使用正则表达式库,但是re2c程序将为您提供无需库的正则表达式解析:它生成正则表达式的DFSM作为C代码。 正则表达式在嵌入在C代码中的注释中指定。
现在看来似乎过度了,但如果您必须解析剩余的字符串,那么稍后这可能会成为一种舒适方式;修改一些正则表达式以调整或添加新语法要比修改一堆临时代币化代码更容易。 并且它可以使您正在解析的内容的结构在您的代码中更加清晰。