printf и wprintf в одном коде C - PullRequest
19 голосов
/ 30 декабря 2011

У меня проблема при использовании вместе функций 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

Я использую gcc (GCC) 4.6.1 20110819 вместе с glibc 2.14 на 64-битной Linux 3.0.

Ответы [ 2 ]

16 голосов
/ 30 декабря 2011

Этого следовало ожидать; Ваш код вызывает неопределенное поведение. В соответствии со стандартом C каждый поток FILE имеет ассоциированную с ним «ориентацию» («байтовую» или «широкую»), которая задается первой выполняемой над ним операцией и которая может быть проверена с помощью функции fwide. Вызов любой функции, ориентация которой противоречит ориентации потока, приводит к неопределенному поведению.

2 голосов
/ 02 марта 2015

В дополнение к принятому ответу R ..:

Хотя это делается очень редко, проверка кода возврата printf / wprintf более четко указывает на то, что один из них не работает (он должен возвращать -1 для функции печати, которая недопустима в соответствии с текущей ориентацией потока).

К сожалению, общий шаблон для проверки ошибок в стандартных функциях библиотеки:

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

Здесь может не сильно помочь: если поток настроен на вывод неширокых символов, и вы вызываете wprintf, errno может не быть установлен, и вы получите wprintf: Success, что не дает много информации.

Так что, действительно, это довольно сложная для понимания проблема, когда вы не знаете о характере ориентации потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...