2

我在 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' to input next param”之后等待我的输入,而是立即从流中读取换行符。

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

4

2 回答 2

3

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

转到项目的属性,在 Configuration Properties、C/C++、Language 下,并确保“Treat WChar_t As Built in Type”设置为 yes。

This is because when the option is set to no, wchar_tbecomes a typedeffor unsigned short, which means you can no longer overload on it. 结果,表达式wcin >> userabort调用了operator>>forunsigned short而不是 for wchar_t,这没有给出正确的结果。

于 2011-08-26T13:54:08.530 回答
0

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

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

你需要#include <limits>得到std::numeric_limits.

于 2011-08-26T13:52:01.927 回答