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.
Ответы
Ответ 1
Этого следует ожидать; ваш код вызывает поведение undefined. По стандарту C каждый поток FILE
связывает с ним "ориентацию" (либо "байтовый", либо "широкий" ), который задается первой выполняемой на ней операции и которая может быть проверена с помощью функции fwide
. Вызов любой функции, ориентация которой конфликтует с ориентацией потока, приводит к поведению undefined.
Ответ 2
Чтобы дополнить R.. принятый ответ:
Хотя это очень редко делается, проверка кода возврата printf
/wprintf
будет более четко указывать на то, что один из них не работает (он должен вернуть -1 для функции печати, которая недействительна в соответствии с текущим ориентация потока).
К сожалению, общий шаблон для проверки ошибок в стандартных библиотечных функциях:
if (wprintf(...) == -1) { perror("wprintf"); ... }
Может не очень помочь здесь: если поток настроен на вывод нешироких символов, и вы вызываете wprintf
, errno
не может быть установлен, и вы получите wprintf: Success
, который не предоставляет много информации.
Итак, это довольно сложно понять, когда вы не знаете о характере ориентации потоков.