在代码中同时使用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;
}
输出:
No printing!
ASCII
而
#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;
}
输出:
Printing!
Wide char
我在64位Linux3.0上使用的是gcc (GCC) 4.6.1 20110819和glibc 2.14。
发布于 2011-12-31 01:10:11
这是意料之中的;您的代码正在调用未定义的行为。根据C标准,每个FILE
流都有一个与之关联的“方向”(“字节”或“宽”),这是由对其执行的第一个操作设置的,并且可以使用fwide
函数进行检查。调用方向与流的方向冲突的任何函数都会导致未定义的行为。
发布于 2015-03-02 23:11:44
为了补充R..的公认答案:
虽然这种情况很少发生,但检查printf
/wprintf
的返回代码会更清楚地表明它们中的一个不工作(对于打印函数,它应该返回-1,根据流的当前方向,该函数是无效的)。
不幸的是,在标准库函数中检查错误的一个常见模式:
if (wprintf(...) == -1) { perror("wprintf"); ... }
在这里可能没有太多帮助:如果流被设置为输出非宽字符,而您调用了wprintf
,则可能没有设置errno
,并且您将获得wprintf: Success
,它不提供太多信息。
因此,当你不知道streams的字符方向时,这确实是一个很难理解的问题。
https://stackoverflow.com/questions/8681623
复制相似问题