首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >单个C代码中的printf和wprintf

单个C代码中的printf和wprintf
EN

Stack Overflow用户
提问于 2011-12-31 00:28:15
回答 2查看 8.6K关注 0票数 24

在代码中同时使用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位Linux3.0上使用的是gcc (GCC) 4.6.1 20110819和glibc 2.14。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-31 01:10:11

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

票数 21
EN

Stack Overflow用户

发布于 2015-03-02 23:11:44

为了补充R..的公认答案:

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

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

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

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

因此,当你不知道streams的字符方向时,这确实是一个很难理解的问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8681623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档