单个C代码中的printf和wprintf
在代码中一起使用printf
和wprintf
函数时遇到问题。 如果首先打印常规字符串,则wprintf
不起作用。 如果我先使用wprintf
那么printf
不起作用。
#include #include #include #include int main() { setlocale(LC_ALL,""); printf("No printing!\n"); wprintf(L"Printing!\n"); wprintf(L"Wide char\n"); printf("ASCII\n"); return 0; }
输出:
No printing! ASCII
而
#include #include #include #include int main() { setlocale(LC_ALL,""); wprintf(L"Printing!\n"); printf("No printing!\n"); wprintf(L"Wide char\n"); printf("ASCII\n"); return 0; }
输出:
Printing! Wide char
我在64位Linux 3.0上使用gcc(GCC)4.6.1 20110819和glibc 2.14。
这是可以预料的; 您的代码正在调用未定义的行为。 根据C标准,每个FILE
流都与它相关联的“方向”(“字节”或“宽”),它由对其执行的第一个操作设置,并且可以使用fwide
函数进行检查。调用其任何函数,方向与流的方向冲突导致未定义的行为。
为了补充R ..的接受答案:
虽然很少这样做,但检查printf
/ wprintf
的返回代码会更清楚地表明其中一个不起作用(对于打印function,它应该返回-1,根据流的当前方向,它是无效的)。
不幸的是,检查标准库函数中的错误的常见模式:
if (wprintf(...) == -1) { perror("wprintf"); ... }
在这里可能没有多大帮助:如果将流设置为输出非宽字符,并且您调用wprintf
,则可能未设置errno
,您将获得wprintf: Success
,它不提供太多信息。
因此,当您不了解流的字符方向时,这确实是一个有点难以理解的问题。