Подтвердить что ты не робот

Printf и wprintf в одном коде C

У меня проблема при использовании 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.

4b9b3361

Ответ 1

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

Ответ 2

Чтобы дополнить R.. принятый ответ:

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

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

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

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

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