【问题标题】:Using sprintf_s with wchar does not format as expected将 sprintf_s 与 wchar 一起使用未按预期格式化
【发布时间】:2018-11-02 20:06:36
【问题描述】:

我正在尝试使用 WCHAR 中的 sprintf_s 创建一个新字符串。我的代码如下:

#include <stdio.h>
#include <Windows.h>
void main(int argc, char ** argv) {
    TCHAR header[200];
    TCHAR* uuid = L"4facda65-5b27-4c70-b7d4-58c57b87682a";
    sprintf_s(&header, 200, "Client-ID: %ws\n", uuid);
    printf("UUID: %ws\n", uuid);
    printf("Header: %ws\n", header);
}

为什么标题打印为Header:而不是Header: 4facda65-5b27-4c70-b7d4-58c57b87682a

我似乎无法弄清楚我做错了什么。

编辑:Tim Randall 的链接帮助我找到了一个可行的解决方案。 用swprintf(header, sizeof(header) / sizeof(*header), L"Client-ID: %ws\n", uuid); 替换sprintf_s 行似乎可行。

不过,我不确定为什么会这样,为什么 sprintf_s 没有?

【问题讨论】:

  • MSVC 编译器输出给出了许多旨在帮助您的警告。
  • TCHAR 并不总是 wchar_t。你是用 UNICODE 编译的吗?
  • TCHAR 是一个过时的、不需要的宏。使用它根本没有意义,但特别是如果您将printf 格式字符串硬编码为使用%ws,则毫无意义。
  • 我看不出该代码是如何编译的。 TCHARwchar_t 在这种情况下 sprintf_s 会抱怨,因为它期望 char* 作为第一个参数,或者 TCHARchar 在这种情况下 TCHAR* uuid = L"..."; 会抱怨因为你试图将宽字符串文字分配给 char* 指针。

标签: c winapi


【解决方案1】:

只需使用旨在处理或打印wchar_t 字符串和明确定义的宽字符串的函数:

WCHAR header[200];
WCHAR* uuid = L"4facda65-5b27-4c70-b7d4-58c57b87682a";
swprintf_s(header, 200, L"Client-ID: %s\n", uuid);
wprintf(L"UUID: %s\n", uuid);
wprintf(L"Header: %s\n", header);

另请参阅:Is TCHAR still relevant?

另请注意,您只需将 header 作为要写入的字符串传递,而不是 &amp;header

【讨论】:

    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多