使用std::wcin读取wchar_t总是得到LF (10,0xa)

Using std::wcin to read wchar_t always gives LF (10, 0xA)

本文关键字:LF 0xa 读取 wcin std wchar 使用      更新时间:2023-10-16

我在msvc++ 2010中使用这段代码来实现用户输入循环:

int wmain(int argc, wchar_t* argv[]) 
{
    vector<wstring> arguments;
    wstring userinput;
    wchar_t userabort;
    do
    {
        wcout << L"Please type param #" << argc++ << L":" << endl;
        wcin >> userinput;
        arguments.push_back(userinput);
        userinput.clear();
        wcout << L"Type 'y' to input next param, 'n' to start program:" << endl;
        wcin >> userabort;
        wcout << L"Userabort: " << userabort << " (" << int(userabort) << ")" << endl;
    }
    while (userabort == L'y' || userabort == L'Y'
        || userabort == L'j' || userabort == L'J');
    return 1;
}

在我的一个项目中,这可以完美地工作(在调试和发布配置中)。在我的另一个项目中,这个非常相同的代码(也只是wmain中的代码)行为奇怪(也在两种配置中):它不会停止等待我的输入后"键入'y'输入下一个参数",而是立即从流中读取换行字符。

我甚至尝试了wcin >> skipws >> userabort;,但结果相同。我完全不知道是什么原因造成的。它可能是一些编译器设置或导入文件的结果吗?或者它可能是按返回userinput wstring发送到程序的结果?

当未指定"将wchar_t视为内置类型" (/Zc:wchar_t)选项时,将出现此行为。

转到项目的属性,在配置属性,C/c++,语言下,并确保"将WChar_t视为内置类型"设置为yes。

这是因为当该选项被设置为no时,wchar_t将成为unsigned shorttypedef,这意味着您不能再对其进行过载。因此,表达式wcin >> userabortunsigned short而不是为wchar_t调用operator>>,这不会给出正确的结果。

我无法解释为什么这段代码可以在一个程序中工作,但在另一个程序中失败。在我看来是不对的。我认为你误解了wcin.clear();的作用。我猜您正在考虑清除流中的任何挂起输入,但它没有。方法就是这一长串代码

wcin.ignore(std::numeric_limits<std::streamsize>::max());

你需要#include <limits>来获得std::numeric_limits