给出以下代码段:
#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 ++的以前版本一样。这段代码有什么问题吗?或者有人知道为什么编译器之间会有这些不同的结果吗?
答案 0 :(得分:4)
"%256c"
期望准确地读取 256个字符,这是C标准(7.21.6.2§12)中指定的:
c 匹配与字段指定数字完全相同的字符序列 宽度(如果指令中没有字段宽度,则为1)。
要获得所需的行为,可以使用eg。 "%255s"
,最多匹配 255个(非空白)字符。
关于为什么这种行为在(不同版本的)实现之间会有所不同的问题:似乎有些实现没有严格地执行 部分,而您所使用的却确实执行了。
由于您的代码依赖于非标准行为,因此在某些时候出现代码中断应该不会意外。