C:为什么" sscanf"不会削减尾随字符?

时间:2015-09-03 23:51:20

标签: c scanf

以下C代码,

#include <stdio.h>
int main()
{
  char *source="{\"address\":\"10.10.2.130\"}";
  char ip[32];
  sscanf(source, "{\"address\":\"%s\"}", ip);
  printf("%s\n%s\n", source, ip);
  return 0;
}

我希望在ip中提取10.10.2.130,但输出显示10.10.2.130&#34;},为什么?

感谢。

3 个答案:

答案 0 :(得分:1)

执行格式字符串的每个部分,而不期待看到将要发生的事情。所以%s匹配字符串的其余部分。格式字符串中的后续字符无法匹配,因为您尝试匹配已经读取的字符。

您可能想要%[^\"]s之类的内容,如果遇到引号,它还会停止阅读。

答案 1 :(得分:1)

%s在到达空格或源字符串结尾时停止扫描。由于您要提取的字符串由"字符终止,因此您可以使用%[^"]停止扫描遇到的第一个"字符,例如:

sscanf(source, "{\"address\":\"%[^\"]\"}", ip);

答案 2 :(得分:1)

%s的规范是:

  

匹配一系列非空白字符。

由于尾​​随"}不是空格,因此它包含在匹配中。

相反,您可以使用%[0-9.]格式仅匹配数字和点。

sscanf(source, "{\"address\":\"%[0-9.]\"}", ip);