sscanf在MSVC ++ 15+中已更改吗?

时间:2018-07-03 12:02:54

标签: c++ visual-c++ scanf

给出以下代码段:

#include <iostream>
#include <cstring>
#include <cstdio>

int main()
{
    char color[256];
    float c,m,y,k;  
    const char* arguments = "0.8500 1 0 0 (Violet)";
    memset(color, 0, 256 * sizeof(char));
    if (sscanf(arguments, "%f %f %f %f %256c", &c, &m, &y, &k, color) == 5)
        std::cout << color; 
}

此产品已经投入生产并使用了至少10到15年(输出颜色名称):

  

(紫罗兰色)

,但是使用最新的Microsoft Visual Studio编译器,或者也使用MSVC ++ 15,结果已更改。 结果不是5,而是4。使用gcc或clang还是5,就像MSVC ++的以前版本一样。这段代码有什么问题吗?或者有人知道为什么编译器之间会有这些不同的结果吗?

1 个答案:

答案 0 :(得分:4)

"%256c"期望准确地读取 256个字符,这是C标准(7.21.6.2§12)中指定的:

  

c 匹配与字段指定数字完全相同的字符序列   宽度(如果指令中没有字段宽度,则为1)。

要获得所需的行为,可以使用eg。 "%255s",最多匹配 255个(非空白)字符。

关于为什么这种行为在(不同版本的)实现之间会有所不同的问题:似乎有些实现没有严格地执行 部分,而您所使用的却确实执行了。

由于您的代码依赖于非标准行为,因此在某些时候出现代码中断应该不会意外。