C: 为什么 "sscanf" 不截尾字符?

C: why "sscanf" doesn't cut trailing characters?

下面的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"},为什么?

谢谢。

格式字符串的每一部分都在执行时不期待看到会发生什么。所以 %s 匹配字符串的其余部分。格式字符串中的后续字符无法匹配,因为您正在尝试匹配已读取的字符。

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

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

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

%s的规格是:

Match a sequence of non-white-space characters.

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

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

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