在尝试输出一些计数的字符串时,我在Microsoft的sprintf()
和wsprintf(
)函数之间遇到以下不对称性:
#define _UNICODE
sprintf(buff, "%.3s", "abcdef"); //Outputs: "abc"
sprintf(buff, "%.*s", 3, "abcdef"); //Outputs: "abc"
wsprintf(buff, L"%.3s", L"abcdef"); //Outputs: L"abc"
wsprintf(buff, L"%.*s", 3, L"abcdef"); //Outputs: L"*s"
请注意,最后一个
wsprintf()
不会像带有相同(但较宽)参数的窄姐妹函数L"abc"
一样输出sprintf()
。问:这是错误还是功能?
注意:这类似于此处描述的问题:
Formatting differences between sprintf() and wsprintf() in VS2015
最佳答案
wsprintf
很旧,很旧。它不能精确记录*
,因此请勿将该格式字符串传递给wsprintf
。您的测试在技术上未指定。
请注意,在wsprintf
中以而不是UTF-16写入buff
时,MessageBox
最多不能写入1023个字符。此函数的设计是为您传递一个固定大小的1024堆栈缓冲区,并且不必担心缓冲区溢出,因为它会为您截断。
就我的意图而言,它更旨在使调试消息传递给snprintf
,而不是用于实际的应用程序。它是n
的简化形式,带有固定的swprintf
,该实现独立于其他标准库而实现。
好的,因此您希望始终为null的终止。尝试这个:
int swprintf2(wchar_t *ws, size_t len, const wchar_t* format, ...)
{
va_arg arg;
va_start(arg, format);
ws[len - 1] = 0;
return vswprintf(ws, len - 1, format, arg);
}
关于c - VS2017中带有“%。* s”的sprintf与wsprintf,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55680894/