2011-09-06 36 views
4

我在控制檯應用程序中使用wcout時發現了一個奇怪的問題。wcout如何工作?

調用某個函數後,其餘的wcout調用根本不起作用。即輸出語句沒有出現在控制檯上。

我注意到在函數中,我使用了一個從未分配過的寬字符數組。

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

在這次調用之後,所有其他wcout都停止工作。

所以,我只是想知道是什麼讓wcout不同COUT,爲什麼這個問題發生,

回答

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

@比利:我把「從來沒有分配過」解釋爲「未初始化」。的確,如果數組是「有效的」,那麼'.clear()'應該重置流狀態。 –

+0

感謝你們倆的幫助。但是,我認爲這是發生的事情。當我用調試器在wArray上方漫遊時,它是一串未被終止的垃圾字符流。 – roymustang86

5

wcout可能做對輸出一些Unicode的驗證;如果驗證失敗,則輸出失敗。這部分是因爲Windows控制檯子系統不能很好地處理Unicode。

檢查流是否有failbitbadbit集。重置流(例如wcout.clear())應恢復流功能。

嚴格來說,coutstd::basic_ostream<char>wcoutstd::basic_ostream<wchar_t> ...這是真的關於它的差異。只是如果Unicode格式良好,那麼對Unicode有更多的要求。