【问题标题】:Using std::wcin to read wchar_t always gives LF (10, 0xA)使用 std::wcin 读取 wchar_t 总是给出 LF (10, 0xA)
【发布时间】:2011-08-26 13:41:07
【问题描述】:

我在 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 &gt;&gt; skipws &gt;&gt; userabort;,但结果相同。我根本不知道是什么原因造成的。可能是某些编译器设置或导入文件的结果吗?或者它可能是按 returnuserinput wstring 发送到程序的结果?任何帮助表示赞赏。

【问题讨论】:

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


    【解决方案1】:

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

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

    This is because when the option is set to no, wchar_t becomes a typedef for unsigned short, which means you can no longer overload on it.结果,表达式wcin &gt;&gt; userabortunsigned short 调用了operator&gt;&gt;,而不是为wchar_t 调用了wchar_t,它没有给出正确的结果。

    【讨论】:

    • @Felix 我想​​我明白了。它与如何在operator&gt;&gt; 上完成重载解决方案有关。我将信息添加到答案中。
    【解决方案2】:

    我无法解释为什么这段代码可以在一个程序中工作,但在另一个程序中失败。在我看来它是错误的。我认为您误解了wcin.clear(); 的作用。我猜您正在考虑清除流中的任何待处理输入,但事实并非如此。做到这一点的方法就是这满口代码

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

    您需要#include &lt;limits&gt; 才能获得std::numeric_limits

    【讨论】:

    • 我添加了clear() 来调查这个错误,只是为了测试。它在一个项目中没有它也可以工作,而在另一个项目中则没有。我现在将它从我的代码中删除以使其更具可读性,因为它真的没有区别。很抱歉,它使您的评论有些断章取义。不过感谢您的回答,我会在输入流上研究clear() 的含义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多