我有一个代码,使用构建工具v110编译时效果很好。最近我将工具链升级到v141(vs 2k17),并且使用sscanf的一些功能不再起作用了。
停止工作的sscanf调用使用此特定格式字符串:"%s %[^\0]"
。它期望一个包含1个字符串的流字符串,后跟一个空格和另一个字符串,这些字符串必须放在一个缓冲区中供以后处理。第一个字符串被正确复制到第一个缓冲区,但第二个字符串没有(sscanf返回1而不是2)。
有人遇到这个问题,或者知道为什么会这样?
用于测试问题的代码示例:
#include <stdio.h>
#include <tchar.h>
int main()
{
char str1[100], str2[100];
memset(str1, 0, sizeof(str1)); memset(str2, 0, sizeof(str2));
int i = sscanf("+nf foo", "%s %[^\0]", str1, str2);
return 0;
}
答案 0 :(得分:3)
序列\0
编码零字节(ASCII字符NUL),在C / C ++中是字符串终止符。
因此,您的格式化字符串实际上是"%s %[^"
,而另一个字符长的字符串"]"
可能跟随它(可能,因为编译器可能会注意到字符串终止并丢弃未使用的尾巴。)
修改强>
作为字符串终结符,NUL字符实际上不会出现在输入字符串中(尽管可能出现在文件流中!我不确定,但是,如何处理fscanf()
),所以你不需要用格式说明符来查找它。如果您只需要将输入字符串的两个部分都读入两个char
数组,只需使用"%s%s"
:
sscanf("+nf foo", "%s%s", str1, str2);
答案 1 :(得分:0)
如用户所述。在主题评论中我使用的字符串(&#34; %[^\0]
&#34;)不起作用,因为char&#34; \0
&#34;将被转换为ASCII NUL,在指定符%[]
的正确结尾之前结束格式字符串。
在这种情况下使用的正确字符串(当您需要使用说明符%[]
来读取所有字节而不是ASCII NUL时)是&#34; %[\1-\377]
&#34;