如何使用sscanf解析带引号的CGDCONT格式字符串?
解决CGDCONT字符串的sscanf解析问题
问题背景
需要解析的目标字符串:
+CGDCONT: 0,"IP","free","10.158.88.34"
需提取的是0(第一个数字)和10.158.88.34(IP的四个分段数字),中间的"free"内容可能变化,需要忽略或准确捕获。
之前尝试的问题
- 使用
"+CGDCONT: %d,\"IP\",\"%*s\",\"%d.%d.%d.%d\"":仅能解析出第一个数字,因为%*s会匹配所有非空白字符,直接把free","10.158.88.34"全部读取,导致后续IP部分无法匹配。 - 硬编码
"free"的格式字符串:能正常工作,但无法适配"free"变化的场景。 - 使用
"+CGDCONT: %d,\"IP\",\"%s\",\"%d.%d.%d.%d\"":%s会读取到字符串末尾(因为无空白字符终止),导致捕获的内容变成free","10.158.88.34"\8,超出预期。
正确的解析模式
方案1:忽略中间的可变内容
使用扫描集%*[^\"]来匹配双引号内的所有字符(直到下一个双引号为止),并忽略该部分:
#include <stdio.h> int main() { char input[] = "+CGDCONT: 0,\"IP\",\"free\",\"10.158.88.34\""; int idx, ip1, ip2, ip3, ip4; int ret = sscanf(input, "+CGDCONT: %d,\"IP\",\"%*[^\"]\",\"%d.%d.%d.%d\"", &idx, &ip1, &ip2, &ip3, &ip4); if (ret == 5) { printf("索引:%d\nIP:%d.%d.%d.%d\n", idx, ip1, ip2, ip3, ip4); } return 0; }
这里%*[^\"]的含义:
%*表示读取但不存储该部分内容[^\"]表示匹配所有不是双引号的字符,刚好对应引号内的可变内容
方案2:同时捕获中间的可变内容
如果需要保留中间的"free"这类内容,同样用扫描集来准确捕获引号内的字符串:
#include <stdio.h> int main() { char input[] = "+CGDCONT: 0,\"IP\",\"free\",\"10.158.88.34\""; char apn[64]; int idx, ip1, ip2, ip3, ip4; int ret = sscanf(input, "+CGDCONT: %d,\"IP\",\"%[^\"]\",\"%d.%d.%d.%d\"", &idx, apn, &ip1, &ip2, &ip3, &ip4); if (ret == 6) { printf("索引:%d\nAPN:%s\nIP:%d.%d.%d.%d\n", idx, apn, ip1, ip2, ip3, ip4); } return 0; }
此模式下apn会准确得到free,不会包含后续的引号和IP内容。
内容的提问来源于stack exchange,提问作者Julien
相关产品推荐
相关产品推荐

