gpt4 book ai didi

c - VS2017 中的 sprintf 与 wsprintf 的比较 "%.*s"

转载 作者:行者123 更新时间:2023-11-30 14:40:07 26 4
gpt4 key购买 nike

在尝试输出一些计数字符串时,我遇到了 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com