2011-09-06 4 views
4

Я заметил странную проблему при использовании wcout в консольном приложении.Как работает wcout?

После вызова определенной функции остальные вызовы wcout не работают вообще. то есть выходные команды не отображаются на консоли.

Я заметил, что в функции я использовал широкий массив символов, который никогда не был назначен.

WCHAR wArray[1024]; 
wcout<<wArray<<endl; 

Это было после этого звонка, все остальные wcout перестали работать.

Итак, я был просто интересно знать, что делает wcout отличается от соиЬ, и почему эта проблема возникла,

ответ

4

Этот пример вызывает неопределенное поведение.

operator<<(std::wostream&,const wchar_t*) ожидает, что буфер будет оканчиваться на нуль и прекратит печатать символы, когда он достигнет первого символа L'\0'. Если буфер содержит нулевой символ (L'\0'), тогда код будет работать «правильно» (хотя выход непредсказуем). Если это не так, то operator<< будет продолжать читать память до тех пор, пока не встретит ее.

Присутствие нулевого терминатора не применяется в вашем примере. Для сравнения, следующее будет печатать неуказанное количество символов, скорее всего, мусор, но четко определено:

WCHAR wArray[1024]; 
wArray[1023] = L'\0'; 
wcout << wArray << endl; 
+0

Примечание: только потому, что массив никогда не назначался, не означает, что массив недействителен. Например, кто-то мог сделать «wcscpy». Я предположил, что декларация должна была просто показать тип переменной в моем ответе. Если OP фактически просто передает неинициализированный массив, то это правильный ответ. В противном случае, я считаю, что это правильный ответ. +1. –

+1

@Billy: Я интерпретировал «никогда не назначенный» как «неинициализированный». Действительно, если массив «действителен», тогда '.clear()' должен сбросить состояние потока. –

+0

Спасибо вам обоим за помощь. Но, я думаю, это было то, что происходило. Когда я зависал над wArray с помощью отладчика, это был поток символов мусора, который не был прерван. – roymustang86

5

wcout могут делать некоторые Юникода проверки на выходе; и отказ выхода, если проверка не выполняется. Это отчасти потому, что подсистема консоли Windows не очень хорошо обрабатывает Юникод.

Проверьте, установлен ли поток failbit или badbit. Сброс потока (например, wcout.clear()) должен восстановить функциональность потока.

Строго говоря, cout является std::basic_ostream<char> и wcout является std::basic_ostream<wchar_t> ... и это на самом деле об этом на различиях. Это просто, что для Unicode больше требований, если этот Unicode должен быть хорошо сформирован.