【问题标题】:extract from string in c using sscanf使用 sscanf 从 c 中的字符串中提取
【发布时间】:2012-11-23 12:28:50
【问题描述】:

我正在尝试使用 sscanf 从字符串{"username":"ece","says":"hello"} 中提取名称和味精的特定值,如下所示:

sscanf(data, "{"\username"\:"\%s"\,"\says"\:"\%s"\}", name, msg);

我在名称中需要“ece”,在 msg 中需要“he​​llo”,但我在名称中得到 ece","says":"hello" 并且 msg 保持为空。

【问题讨论】:

  • 看起来像json格式。如果案例尝试使用libjson

标签: c string character scanf


【解决方案1】:

1) 在整个字符串格式中,您必须使用\" 更正此"\\ 提到下一个字符是特殊字符," 是特殊字符

2) 对于usernamesays,您必须将%s 替换为%[^\"]。上面这个正则表达式意味着你想要捕获不包含" 的字符串。所以字符串的捕获将停止在第一个"

sscanf(s, "{\"username\":\"%[^\"]\",\"says\":\"%[^\"]\"}", name, msg);

【讨论】:

  • @DanielFischer:我无法使用单个 fscanf 在 /etc/resolv.conf 中获取第一个名称服务器。我试过fscanf(fp,"%*nameserver:%20[^\n]",address);,它返回 0(没有找到结果);而address 是空的。 (是的,之前用 fopen 成功打开过的文件)。
【解决方案2】:

问题是 %s 转换规范会读取输入,直到它到达空白字符。因此,您在第一个变量中拥有“用户名”之后的所有数据。

【讨论】:

    【解决方案3】:

    您需要将转义符 \放在转义符之前。

    sscanf(data, "{\"username\":\"%s\",\"says\":\"%s\"}", name, msg);
    

    除非用户名后面有空格,否则缓冲区中的所有内容都将被读入name

    使用反字符集而不是 %s,例如 %[^\"]

    【讨论】:

      【解决方案4】:

      %s 格式在下一个空格处停止。你需要它早点停止,在'"',所以你需要使用一个字符集,

      sscanf(data, "{\"username\":\"%[^\"]\",\"says\":\"%s\"}", name, msg);
                                    ^^^^^^
                                read up to the next double quote
      

      【讨论】:

        猜你喜欢
        • 2016-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-14
        相关资源
        最近更新 更多