我正在尝试使用sscanf从字符串{"username":"ece","says":"hello"}
中提取名称和消息的特定值,如下所示:
sscanf(data, "{"\username"\:"\%s"\,"\says"\:"\%s"\}", name, msg);
我需要名字中的'ece'和msg中的'hello'但是我得到了ece“,”“”你好“名字和msg仍然是空的。
答案 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);