我正在尝试使用 sscanf 从字符串中提取 name 和 msg 的特定值,{"username":"ece","says":"hello"}
如下所示:
sscanf(data, "{"\username"\:"\%s"\,"\says"\:"\%s"\}", name, msg);
我需要名称中的“ece”和味精中的“你好”,但我在名称中得到 ece","says":"hello" 并且味精保持为空。
%s
格式在下一个空白处停止。你需要它早点停止,在'"'
,所以你需要使用一个字符集,
sscanf(data, "{\"username\":\"%[^\"]\",\"says\":\"%s\"}", name, msg);
^^^^^^
read up to the next double quote
您需要将转义字符放在转义字符\
之前。
sscanf(data, "{\"username\":\"%s\",\"says\":\"%s\"}", name, msg);
除非用户名后面有空格,否则缓冲区中的所有内容都将被读入name
.
使用反字符集而不是 %s,像这样%[^\"]
问题是 %s 转换规范会读取输入,直到它到达空白字符。因此,您在第一个变量中拥有“用户名”之后的所有数据。
1)在整个字符串格式中,您必须"\
使用\"
. \
提到下一个字符是特殊字符并且是"
特殊字符
2)你必须同时%s
替换和。上面这个正则表达式意味着你想要捕获不包含. 所以字符串的捕获将在第一个停止%[^\"]
username
says
"
"
sscanf(s, "{\"username\":\"%[^\"]\",\"says\":\"%[^\"]\"}", name, msg);