使用sscanf从c中提取字符串

时间:2012-12-05 16:00:47

标签: c string character scanf

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

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

我需要名字中的'ece'和msg中的'hello'但是我得到了ece“,”“”你好“名字和msg仍然是空的。

4 个答案:

答案 0 :(得分:5)

%s格式在下一个空格处停止。您需要在'"'之前提前停止,因此您需要使用字符集

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

答案 1 :(得分:2)

您需要在转义字符前加上转义\

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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