我正在将一些代码从多字节移动到 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 );
Output:
Multibyte = 2.123
Unicode = *f
我期望两者都能给我一个精确到小数点后三位的浮点数。我究竟做错了什么?
正如 Hans 在评论中提到的,答案是你永远不应该使用 wsprintf()。它总是被损坏,不支持与 C 标准“swprintf()”相同的格式参数,并且 Microsoft 文档没有明确说明它是如何损坏的或原因。
我只是在尝试调试相关函数时才发现这一点:wvsprintf()。该函数似乎具有相同的限制,并且也应该被它的工作替代品所取代:“vswprintf()”。名称与工作版本的相似性非常不幸,与标准 C 库函数和命名方法的明显相似性也是如此。我不知道为什么这些函数在 2017 年仍然提供,也不知道为什么 Microsoft 编译器在与不受支持的参数一起使用时不会像“sprintf()”那样生成警告。
我发布此内容是为了提高可见性,因为在 Google 上搜索这些功能似乎并没有让这些巨大的缺陷变得明显。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)