意外的无限循环(C ++)

时间:2014-03-16 17:21:12

标签: c++ loops while-loop infinite

while(true)
{
    unsigned int option;
    cout<<"1 - Display the list\n";
    cout<<"2 - Add a game title to the list\n";
    cout<<"3 - Remove a game title from the list\n";
    cout<<"4 - Exit\n";
    cin>>option;

    if(option == 1)
    {
        if(gameTitles.empty())
        {
            cout<<"\nThere are no games to be displayed. Please try again after adding some games to the list.\n";
        }
        else
        {
            for(iter = gameTitles.begin(); iter != gameTitles.end(); ++iter)
            {
                cout<<*iter<<endl;
            }
        }
    }
    else if(option == 2)
    {
        cout<<"\nEnter the game's title:\n";
        cin>>newGame;
        gameTitles.push_back("newGame");
    }
    else if(option == 3)
    {
        cout<<"\nEnter a game to be removed:\n";
        cin>>removeGame;
        theIterator = find(gameTitles.begin(),gameTitles.end(),removeGame);
        theIterator = gameTitles.erase(theIterator);
    }
    else if(option == 4)
    {
        break;
    }
    else
    {
        cout<<"\nThe option is illegal. Please try again.\n";
    }
}

当我选择任何1,3,4或非法选项时,循环将我带到顶部,我有可能再次选择。当我尝试使用第二个选项时出现问题。我只是进入一个无限循环。但我想输入一个游戏标题,然后将它添加到我的矢量(我之前宣布它),然后有可能再次选择一个选项。

2 个答案:

答案 0 :(得分:1)

你没有显示newGame的类型,但我猜它是std::string类型,你输入一个带有两个单词的标题:流读取第一个单词并停止阅读。接下来你要做的是读取失败的int并保持option的值不变。从那时起,流不会做任何事情,只是继续阅读。

在使用结果之前,关键错误并未检查读取尝试是否成功:始终需要在读取之后以及使用之前验证输入是否成功结果。当输入操作失败时,流进入失败模式,即std::ios_base::failbit被设置,并且它转换为false而不是true(实际上它转换为空指针vs.一个非空指针,但这个细节与此讨论无关)。一旦处于失败状态,流将不会做任何事情,直到流状态为clear()。您可能还需要ignore()有问题的人物。

也就是说,你当然应该使用像

这样的东西
if (std::cin >> option) {
    // do something with the option
}
else {
    std::cout << "expected an integer: ignoring the line\n";
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

要阅读标题,您应该阅读整行。由于option的格式化输入会在流中留下换行符,因此您首先需要跳过该字符。也就是说,新标题的输入看起来像这样:

if (std::getline(std::cin >> std::ws, newGame)) {
    // ...
}

std::ws操纵器会跳过所有前导空格。这可能适合您的需求。如果正在读取的字符串可能具有前导空白字符,则需要不同的字符。

答案 1 :(得分:0)

在您尝试再次查询相同的变量newgame之前,请输入cin.ignore()。如果我没记错的话,你第一次看到一个字符串(我假设newgame是一个字符串),它会留下一个尾随\n,所以它会在以后的提示中自动输入。