为什么control + P在C ++(Visual Studio)中导致无限循环?

时间:2014-10-31 03:04:06

标签: c++ visual-studio vector visual-studio-2013 infinite-loop

我已经编程了一段时间(在Prolog,Scheme和C中的一点点),但我最近决定了解我的C ++知识。我解决了一个用来说明矢量的问题。它本质上是一个创建数据库的项目,该数据库创建一个向量来临时存储用户输入的各种游戏,并删除他们不想要的游戏。代码本身运行正常,不如方案或Prolog可以做到的那么漂亮,但它的工作原理。

然而,我不小心在程序的第一个提示符中键入了“Control P”,我得到了最奇怪的结果:它开始无限循环。我再次尝试了使用“Control Z”,我得到了相同的结果。我没有尝试任何其他关键组合,但我想可以找到其他一些组合。这不是一个非常令人担忧的问题,但我很想知道为什么会这样做。它是关于C ++的,还是仅仅是Visual Studio?无论如何,这是来源:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
cout << "Welcome to the Cpp Games Database!";

int x = 0;
string game = "";
vector <string> games;
vector <string>::const_iterator iter;
while (x != 4){
    cout<< "\n\nPlease choose from the list bellow to decide what you want to do:\n";
    cout<< "1. Add Games to the Database.\n"
        << "2. Remove Games from the Database.\n"
        << "3. List all the Games.\n"
        << "4. Exit.\n"
        << "\n(Type the number of your choice and hit return)\n";
    cin >> x;
    switch (x){
        case 1:
            game = "";
            do{
                cout << "\nPlease Input a Game (type esc to exit): ";
                cin >> game;
                games.push_back(game);
            } while (game != "esc");
            games.pop_back();
            break;

        case 2:
            game = "";
            do{
                cout << "\nPlease input the game you would like to remove(or type esc to exit): ";
                cin >> game;
                iter = find(games.begin(), games.end(), game);
                if(iter != games.end())
                    games.erase(iter);
                else cout << "\nGame not found, try again please.\n";
            } while (game != "esc");
            break;

        case 3:
            cout << "\nYour Games are:\n";
            for (iter = games.begin(); iter != games.end(); iter++)
            {
                cout << endl << *iter << endl;
            }
            break;
        default: break;
    }
}
return 0;
}

1 个答案:

答案 0 :(得分:0)

由于您没有为cin输入有效数据,因此它会卡在那里等待数据被重新处理或丢弃以进行新输入。您需要检查输入并仅接受有效数据。基本上cin保留了原始数据,并不断尝试处理它。

始终验证您的输入,如果输入无效则将其丢弃。

以下是关于同一问题的另一个答案,以获得更多洞察力(使用源代码)。 https://stackoverflow.com/a/17430697/1858323