c++ - 使用 std::wcin 读取 wchar_t 总是给出 LF (10, 0xA)

标签 c++ visual-studio-2010 visual-c++ user-input cin

我在 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 中的唯一代码)表现得很奇怪(在两种配置中也是如此):它不会在“Type 'y'”之后停止等待我的输入输入下一个参数”,而是立即从流中读取换行字符。

我什至尝试过 wcin >> skipws >> userabort; 但结果相同。我根本不知道是什么原因造成的。可能是某些编译器设置或导入文件的结果吗?或者它可能是按 returnuserinput wstring 发送到程序的结果?任何帮助表示赞赏。

最佳答案

当未指定“将 wchar_t 视为内置类型”(/Zc:wchar_t) 选项时,似乎会发生此行为。

转到项目的属性,在配置属性、C/C++、语言下,确保“将 WChar_t 视为内置类型”设置为是。

这是因为当该选项设置为 no 时,wchar_t 变成了 unsigned shorttypedef,这意味着您不能再重载在上面。结果,表达式 wcin >> userabortunsigned short 调用了 operator>> 而不是为 wchar_t,它没有给出正确的结果。

关于c++ - 使用 std::wcin 读取 wchar_t 总是给出 LF (10, 0xA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7205529/

相关文章:

c# - 复制大文件时更新进度条

visual-studio-2010 - MSVC 相当于 __builtin_popcount?

templates - 在 C++ 模板类中重载 () 运算符时出错

c++ - 这不是我要求的输出

c++ - .lib 子依赖项

c++ - linux轮询串口传输端

C++ 变量 - 声明和定义。遗产

VB.net,如何按值对集合项进行排序

C++、COM 和传递字符串

java - 操作 QAndroidJniObject 数组