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

标签 c windows visual-studio-2017

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

相关文章:

c - 二叉树和链表,C中保留头节点

c++ - C++ MFC 程序是完全原生的吗?

c++ - 解决由于具有可能已删除的默认构造函数的不变成员而导致的编译器错误

c++ - 如何使用 Visual C++(非 C++/CLI)处理 .mdb 数据库?

android - 如何从头开始编写 Android 平板电脑的 LCD 驱动程序?

c - 如何让 GTK 识别我创建的模板?

c - perror() 或自己的字符串输出到 C 中的 stderr

windows - 在bat文件中运行bat文件

windows - 有没有什么好的方法可以绕过运行EXE文件的限制?

git - Visual Studio 2017 - Git 因 fatal error 而失败