我在控制檯應用程序中使用wcout時發現了一個奇怪的問題。wcout如何工作?
調用某個函數後,其餘的wcout調用根本不起作用。即輸出語句沒有出現在控制檯上。
我注意到在函數中,我使用了一個從未分配過的寬字符數組。
WCHAR wArray[1024];
wcout<<wArray<<endl;
在這次調用之後,所有其他wcout都停止工作。
所以,我只是想知道是什麼讓wcout不同COUT,爲什麼這個問題發生,
我在控制檯應用程序中使用wcout時發現了一個奇怪的問題。wcout如何工作?
調用某個函數後,其餘的wcout調用根本不起作用。即輸出語句沒有出現在控制檯上。
我注意到在函數中,我使用了一個從未分配過的寬字符數組。
WCHAR wArray[1024];
wcout<<wArray<<endl;
在這次調用之後,所有其他wcout都停止工作。
所以,我只是想知道是什麼讓wcout不同COUT,爲什麼這個問題發生,
本示例調用未定義的行爲。
operator<<(std::wostream&,const wchar_t*)
預計緩衝區空終止,並且當它到達第一個L'\0'
字符時停止打印字符。如果緩衝區恰好包含空字符(L'\0'
),那麼代碼將「正確」運行(儘管輸出是不可預知的)。如果沒有,那麼operator<<
將繼續讀取內存,直到它遇到一個。
您的示例不會強制使用空終止符。相比之下,下面的內容會打印一個未指定數量的字符,很可能是垃圾,但是已經定義好了:
WCHAR wArray[1024];
wArray[1023] = L'\0';
wcout << wArray << endl;
wcout
可能做對輸出一些Unicode的驗證;如果驗證失敗,則輸出失敗。這部分是因爲Windows控制檯子系統不能很好地處理Unicode。
檢查流是否有failbit
或badbit
集。重置流(例如wcout.clear()
)應恢復流功能。
嚴格來說,cout
是std::basic_ostream<char>
和wcout
是std::basic_ostream<wchar_t>
...這是真的關於它的差異。只是如果Unicode格式良好,那麼對Unicode有更多的要求。
注意:僅僅因爲數組從未分配過,並不表示數組無效。例如,有人可以爲它做一個'wcscpy'。我認爲該聲明只是爲了在我的答案中顯示變量的類型。如果OP實際上只是傳遞一個未初始化的數組,那麼這是正確的答案。否則,我相信我的答案是正確的。 +1。 –
@比利:我把「從來沒有分配過」解釋爲「未初始化」。的確,如果數組是「有效的」,那麼'.clear()'應該重置流狀態。 –
感謝你們倆的幫助。但是,我認爲這是發生的事情。當我用調試器在wArray上方漫遊時,它是一串未被終止的垃圾字符流。 – roymustang86