我正在将一些代码从多字节转移到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 );
输出:
Multibyte = 2.123
Unicode = *f
我期待两个给我一个浮点数到3位小数。我做错了什么?
答案 0 :(得分:1)
正如汉斯在评论中所提到的,答案是你永远不应该使用wsprintf()。它总是被破坏,不支持与C标准“swprintf()”相同的格式化参数,并且Microsoft文档没有说明它是如何被破坏或为什么。
我在尝试调试相关函数时才发现这个:wvsprintf()。此函数似乎具有相同的限制,也应该替换为其工作替换:“vswprintf()”。名称与工作版本的相似性是非常不幸的,因为它与标准C库函数和命名方法明显接近。我不知道为什么这些函数仍然在2017年交付,也不知道为什么Microsoft编译器在使用不受支持的参数时不会生成警告,就像它对“sprintf()”一样。
由于在Google上搜索这些功能似乎不会使这些巨大的漏洞显而易见,我发布此信息是为了提高可见性。