单个C代码中的printf和wprintf

Hub*_*rio 19 c gcc internationalization

在代码中使用printfwprintf一起使用时遇到问题.如果首先打印常规字符串,则wprintf不起作用.如果我wprintf先使用则printf不起作用.

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

int main() 
{
    setlocale(LC_ALL,"");

    printf("No printing!\n");
    wprintf(L"Printing!\n");
    wprintf(L"Wide char\n");
    printf("ASCII\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

No printing!
ASCII
Run Code Online (Sandbox Code Playgroud)

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

int main() 
{
    setlocale(LC_ALL,"");

    wprintf(L"Printing!\n");
    printf("No printing!\n");
    wprintf(L"Wide char\n");
    printf("ASCII\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Printing!
Wide char
Run Code Online (Sandbox Code Playgroud)

我在64位Linux 3.0上使用gcc(GCC)4.6.1 20110819和glibc 2.14.

R..*_*R.. 16

这是可以预料的; 您的代码正在调用未定义的行为.根据C标准,每个FILE流都与它相关联的"方向"("字节"或"宽"),它由对其执行的第一个操作设置,并且可以使用该fwide函数进行检查.调用任何方向冲突的函数与流的方向导致未定义的行为.

  • @alk未定义的行为意味着在这种情况下不应该对它应该如何表现.因此,输出任何内容都是可以接受的,就像将文本静默转换为正确的方向或打印垃圾一样. (2认同)
  • OK,所以这是wprintf(3)手册页中的一个错误:它没有提到这个问题... (2认同)
  • 是否可以重新打开 `stdout` 并更改方向? (2认同)

ano*_*nol 5

为了补充 R.. 接受的答案:

虽然这种情况很少发生,但检查printf/的返回代码wprintf会更清楚地表明其中之一不起作用(对于打印函数,它应该返回 -1,根据流的当前方向,该函数无效)。

不幸的是,检查标准库函数中的错误的常见模式:

if (wprintf(...) == -1) { perror("wprintf"); ... }
Run Code Online (Sandbox Code Playgroud)

在这里可能没有多大帮助:如果流设置为输出非宽字符,并且您调用wprintf,errno可能不会被设置,并且您会得到wprintf: Success,这不会提供太多信息。

因此,当您不了解流的字符方向时,这确实是一个有点难以理解的问题。