You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用sscanf解析带引号的CGDCONT格式字符串?

解决CGDCONT字符串的sscanf解析问题

问题背景

需要解析的目标字符串:

+CGDCONT: 0,"IP","free","10.158.88.34"

需提取的是0(第一个数字)和10.158.88.34(IP的四个分段数字),中间的"free"内容可能变化,需要忽略或准确捕获。

之前尝试的问题

  1. 使用"+CGDCONT: %d,\"IP\",\"%*s\",\"%d.%d.%d.%d\"":仅能解析出第一个数字,因为%*s会匹配所有非空白字符,直接把free","10.158.88.34"全部读取,导致后续IP部分无法匹配。
  2. 硬编码"free"的格式字符串:能正常工作,但无法适配"free"变化的场景。
  3. 使用"+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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:05:58