我在控制台应用程序中使用wcout时发现了一个奇怪的问题。
在调用某个函数后,其余的wcout调用根本不起作用。即输出语句没有出现在控制台上。
我注意到在函数中,我使用了一个从未赋值的宽字符数组。
WCHAR wArray[1024];
wcout<<wArray<<endl;
在这次电话会议之后,所有其他wcout都停止了工作。
所以,我只是想知道是什么让wcout与cout不同,以及为什么会出现这个问题,
答案 0 :(得分:5)
wcout
可能正在对输出进行一些unicode验证;如果验证失败,则输出失败。这部分是因为Windows控制台子系统不能很好地处理Unicode。
检查流是否设置了failbit
或badbit
。重置流(例如wcout.clear()
)应恢复流功能。
严格地说,cout
是std::basic_ostream<char>
而wcout
是std::basic_ostream<wchar_t>
......而且差异就是真的。只是如果要形成良好的Unicode,对Unicode有更多的要求。
答案 1 :(得分:4)
此示例调用未定义的行为。
operator<<(std::wostream&,const wchar_t*)
期望缓冲区为空终止,并在到达第一个L'\0'
字符时停止打印字符。如果缓冲区恰好包含空字符(L'\0'
),则代码将“正确”运行(尽管输出是不可预测的)。如果没有,则operator<<
将继续读取内存,直到遇到内存为止。
您的示例不强制存在空终止符。相比之下,以下内容将打印一个未指定数量的字符,很可能是垃圾字符,但定义明确:
WCHAR wArray[1024];
wArray[1023] = L'\0';
wcout << wArray << endl;