在C语言中使用sscanf从字符串中提取内容

5
我将使用sscanf从字符串{"username":"ece","says":"hello"}中提取名称和消息的特定值,格式如下:
sscanf(data, "{"\username"\:"\%s"\,"\says"\:"\%s"\}", name, msg);

我需要在名称中使用“ece”,在消息中使用“hello”,但我得到的是名称和消息都为空,而名称为“ece”、“says”:“hello”。

2
看起来像是JSON格式。如果是这种情况,尝试使用libjson库。 - MOHAMED
4个回答

6

%s格式在遇到下一个空格时停止。你需要它在更早的位置停止,即在'"'处停止,因此需要使用字符集。

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

2

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

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

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

使用反向字符集代替%s,就像这样%[^\"]


0
问题在于 %s 转换说明符会读取输入,直到遇到空格字符为止。因此,您在第一个变量中拥有“用户名”后面的所有数据。

0

1)在整个字符串格式中,您需要将"\更正为\"\表示下一个字符是特殊字符,而"是特殊字符。

2)您需要将%s替换为%[^\"],对于usernamesays都是如此。上述正则表达式意味着您想捕获不包含"的字符串。因此,字符串的捕获将停止在第一个"处。

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

@DanielFischer:我在使用单个fscanf获取/etc/resolv.conf中的第一个nameserver时遇到了问题。我尝试过fscanf(fp,"%*nameserver:%20[^\n]",address);,但返回值为0(未找到结果);而且address为空。(是的,在此之前已经成功使用fopen打开了文件)。 - user2284570

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接