在尝试输出一些计数字符串时,我遇到了 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()
不会像其窄姐妹函数 sprintf()
那样输出 L"abc"
,并具有相同的 (但范围很广)争论。
问:这是错误还是功能?
注意:这与此处描述的问题类似: Formatting differences between sprintf() and wsprintf() in VS2015
最佳答案
wsprintf
很旧,非常旧。它不会精确记录 *
,因此不要将该格式字符串传递给 wsprintf
。您的测试在技术上未指定。
请注意,wsprintf
不会向 buff
写入超过 1023 个字符,后跟空字符,并且采用 UCS-2 而不是 UTF-16。这个函数的设计是你向它传递一个固定大小的堆栈缓冲区 1024 并且不用担心缓冲区溢出,因为它会为你截断。
据我所知,它的目的更多是为了将调试消息传递到 MessageBox
而不是用于实际的应用程序使用。它是 snprintf
的简化形式,具有固定的 n
,独立于其他标准库实现。
好的,所以您需要一个始终以 null 终止的 swprintf
。试试这个:
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 中的 sprintf 与 wsprintf 的比较 "%.*s",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55680894/