5

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

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

我需要名称中的“ece”和味精中的“你好”,但我在名称中得到 ece","says":"hello" 并且味精保持为空。

4

4 回答 4

6

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

sscanf(data, "{\"username\":\"%[^\"]\",\"says\":\"%s\"}", name, msg);
                              ^^^^^^
                          read up to the next double quote
于 2012-12-05T16:04:56.537 回答
2

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

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

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

使用反字符集而不是 %s,像这样%[^\"]

于 2012-12-05T16:05:26.133 回答
0

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

于 2012-12-05T16:05:34.323 回答
0

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

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

sscanf(s, "{\"username\":\"%[^\"]\",\"says\":\"%[^\"]\"}", name, msg);
于 2012-12-05T17:16:11.513 回答