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或非法选项时,循环将我带到顶部,我有可能再次选择。当我尝试使用第二个选项时出现问题。我只是进入一个无限循环。但我想输入一个游戏标题,然后将它添加到我的矢量(我之前宣布它),然后有可能再次选择一个选项。
答案 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
,所以它会在以后的提示中自动输入。