Hub*_*rio 19 c gcc internationalization
在代码中使用printf和wprintf一起使用时遇到问题.如果首先打印常规字符串,则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函数进行检查.调用任何方向冲突的函数与流的方向导致未定义的行为.
为了补充 R.. 接受的答案:
虽然这种情况很少发生,但检查printf/的返回代码wprintf会更清楚地表明其中之一不起作用(对于打印函数,它应该返回 -1,根据流的当前方向,该函数无效)。
不幸的是,检查标准库函数中的错误的常见模式:
if (wprintf(...) == -1) { perror("wprintf"); ... }
Run Code Online (Sandbox Code Playgroud)
在这里可能没有多大帮助:如果流设置为输出非宽字符,并且您调用wprintf,errno可能不会被设置,并且您会得到wprintf: Success,这不会提供太多信息。
因此,当您不了解流的字符方向时,这确实是一个有点难以理解的问题。