【问题标题】:fwprintf: only the first character from a wide char array argument gets copied to outputfwprintf:只有宽字符数组参数中的第一个字符被复制到输出
【发布时间】:2018-03-06 10:19:30
【问题描述】:

我正在尝试使用以下代码将包含“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 的第一个字符被复制到输出?

【问题讨论】:

    标签: c io string-formatting wchar


    【解决方案1】:

    你需要改变:

    L"alpha = %s\n";
    

    到:

    L"alpha = %S\n";
    

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

    阅读documentation for printf format specifiers

    【讨论】:

      【解决方案2】:

      对于符合 C99 的编译器,请使用 "%ls"

      如果存在l 长度修饰符,则参数应为指向wchar_t 类型数组的初始元素的指针。 C11dr §7.29.2.1 10.

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

      【讨论】:

      • @Kais 这对您的编译器有用吗?如果没有,您使用的是什么编译器/版本?
      • 是的。顺便说一句,我在 linux 下使用 gcc 6.3.0。
      • @Kais 我使用6.4.0,但问题可能更多是库版本:Ref - 我的是 2.9.0
      • 可能是这样..我的是2.24。
      猜你喜欢
      • 2012-10-05
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      相关资源
      最近更新 更多