c++ - sscanf 在 MSVC++ 15+ 中有变化吗?

标签 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 年(它输出颜色名称):

(Violet)

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

最佳答案

"%256c" 期望读取 正好 256 个字符,如 C 标准 (7.21.6.2 §12) 中所指定:

c Matches a sequence of characters of exactly the number specified by the field width (1 if no field width is present in the directive).

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

关于为什么这种行为在实现(的版本)之间不同的问题:似乎有几种实现没有强制执行 exactly 部分,而您使用的是。

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

关于c++ - sscanf 在 MSVC++ 15+ 中有变化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51154152/

相关文章:

c++ - com 如何提供与语言无关的数据类型

c# - Google Cloud Datastore 请求在我的浏览器中返回错误 400

c++ - 在 Visual C++ 中测试 double

windows - 如何强制 native 应用程序使用较旧的 C 运行时

c++ for循环优化问题

c - 为什么 scanf 不保存我请求的 "size of an array ' n' "并将其传递到 for 循环?

c - 尝试将字符串扫描到c中结构的2个不同元素

c - 重温 C 中的解析输入

c++ - 如何将 .pgm 纹理文件加载到 openGL

c++ - 电容传感器问题