printf和wprintf在单个C代码中?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

在代码中使用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;
}

输出:

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位Linux 3.0上使用gcc(GCC)4.6.1 20110819和glibc 2.14。

提问于
用户回答回答于

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

用户回答回答于

虽然这很少完成,但检查printf/ 的返回代码wprintf将更清楚地表明其中一个不工作(它应该返回-1,因为打印功能根据流的当前方向是无效的)。

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

if (wprintf(...) == -1) { perror("wprintf"); ... }

这里可能没有什么帮助:如果流设置为输出非宽字符,并且你打电话wprintferrno可能没有设置,你会得到wprintf: Success,它不提供很多信息。

所以当你不知道流的字符方向时,这确实是一个难以理解的问题。

扫码关注云+社区