fwprintf:只有宽字符数组参数中的第一个字符被复制到输出

fwprintf: only the first character from a wide char array argument gets copied to output

我正在尝试使用以下代码将包含 "alpha = abcd" 的消息写入文本文件:

#include <stdio.h>
#include <wchar.h>

int
main()
{
        const wchar_t *a = L"abcd", *msg = L"alpha = %s\n";
        FILE          *f = fopen("./deleteme", "a");

        fwprintf(f, msg, a);
        fclose(f);
}

但是,在编译和执行程序后,我得到了这个输出:

alpha = a

为什么只有来自 const a 的第一个字符被复制到输出?

您需要更改:

L"alpha = %s\n";

至:

L"alpha = %S\n";

您尝试打印的参数 (a = L"abcd") 是一个 wide 字符串,因此您需要 %S(大写)而不是 %s(小写)。对类似 printf 的函数使用不正确的格式说明符是未定义的行为。

阅读documentation for printf format specifiers

使用 C99 兼容编译器,使用 "%ls"

If an l length modifier is present, the argument shall be a pointer to the initial element of an array of wchar_t type. C11dr §7.29.2.1 10.

// const wchar_t *msg = L"alpha = %s\n";
const wchar_t *msg = L"alpha = %ls\n";