2017-10-19 262 views
0

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

wsprintf是内置于Windows的帮助函数。回到Win3,并且需要在640KB内存中填充一个操作系统及其应用程序。它切割了一个角落,它不支持浮点。 MSDN文章大吼“不要使用”。使用CRT功能,而不是swprintf。 –

+0

你是对的汉斯,但MSDN文档和编译器告诉我有关C标准库中的所有字符串函数,并且正在编译旧代码。然而,看起来wsprintf()对于浮点数是打破的,但swprintf()不是。这似乎相当混乱,因为很容易将它们混合起来,特别是因为其他TCHAR函数在名称中倾向于具有“t”,例如, _tcscpy() – Piers

回答

0

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

我只在试图调试相关函数时发现了这个:wvsprintf()。这个函数似乎有相同的限制,也应该用它的工作替换替换:“vswprintf()”。名称与工作版本的相似性是非常不幸的,正如明显接近标准C库函数和命名方法一样。我不知道为什么这些函数仍然在2017年交付,也不知道为什么Microsoft编译器在使用不受支持的参数时不会像使用“sprintf()”一样生成警告。

我正在发布此功能,因为在Google上搜索这些功能似乎并未使这些大规模漏洞变得明显。