升级到v141时,sscanf是否停止工作?

时间:2017-12-21 11:38:50

标签: c++ visual-c++

我有一个代码,使用构建工具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;
}

2 个答案:

答案 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;