VS2015中sprintf()和wsprintf()的格式差异

Pie*_*ers 3 visual-c++ visual-studio-2015

我正在将一些代码从多字节移动到 unicode,并发现我的字符串格式出现错误。看起来 Visual Studio 2015 在 sprintf() 和 wsprintf() 之间处理宽度参数说明符“*”的方式不同。这是编译器错误或副作用,还是我错过了一些非常明显的东西?

下面的代码,带有输出:

char    cOutA [ 64 ];
wchar_t wcOutA [ 64 ];

sprintf ( cOutA, "Multibyte = %.*f\n", 3, 2.12345 );
wsprintf ( wcOutA, L"Unicode = %.*f\n", 3, 2.12345 );

printf ( cOutA );
wprintf ( wcOutA );
Run Code Online (Sandbox Code Playgroud)

输出:

Multibyte = 2.123
Unicode = *f
Run Code Online (Sandbox Code Playgroud)

我期望两者都能给我一个精确到小数点后三位的浮点数。我究竟做错了什么?

Pie*_*ers 5

正如汉斯在评论中提到的,答案是你永远不应该使用 wsprintf()。它总是被破坏,不支持与 C 标准“swprintf()”相同的格式参数,并且 Microsoft 文档没有明确说明它是如何被破坏的或为什么被破坏。

我只是在尝试调试相关函数时才发现这一点:wvsprintf()。该函数似乎具有相同的限制,并且也应该被它的工作替代品所取代:“vswprintf()”。名称与工作版本的相似性非常不幸,与标准 C 库函数和命名方法的明显相似性也是如此。我不知道为什么这些函数在 2017 年仍然提供,也不知道为什么 Microsoft 编译器在与不受支持的参数一起使用时不会像“sprintf()”那样生成警告。

我发布此内容是为了提高可见性,因为在 Google 上搜索这些功能似乎并没有让这些巨大的缺陷变得明显。