我尝试获取用户选择的游戏名称并将其存储在矢量中。 我使用getline,因此用户可以使用空格。 当我尝试输入新游戏时,它不会让我。 它自动显示我的游戏库。 请告诉我我做错了什么。 问题在于 if(action ==“add”)
这是我的代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
vector<string>::const_iterator myIterator;
vector<string>::const_iterator iter;
vector<string> games;
games.push_back("Crysis 2");
games.push_back("GodOfWar 3");
games.push_back("FIFA 12");
cout <<"Welcome to your Games Library.\n";
cout <<"\nThese are your games:\n";
for (iter = games.begin(); iter != games.end(); ++iter)
{
cout <<*iter <<endl;
}
//the loop!
string action;
string newGame;
cout <<"\n-Type 'exit' if you want to quit.\n-Type 'add' if you want to add a game.\n-Type 'delete' if you want to delete a game.\n-Type 'find' if you want to search a game.\n-Type 'game' if you don't know what game to play.\n-Type 'show' if you want to view your library.";
while (action != "exit")
{
cout <<"\n\nWhat do you want to do: ";
cin >> action;
//problem is here
if (action == "add")
{
cout <<"\nType the name of the game you want to add: ";
getline (cin, newGame);
games.push_back(newGame);
for (iter = games.begin(); iter != games.end(); ++iter)
{
cout <<*iter <<endl;
}
continue;
}
else if (action == "show")
{
cout <<"\nThese are your games:\n";
for (iter = games.begin(); iter != games.end(); ++iter)
{
cout <<*iter <<endl;
}
}
else if (action == "delete")
{
cout <<"Type the name of the game you want to delete: ";
cin >> newGame;
getline (cin, newGame);
iter = find(games.begin(), games.end(), newGame);
if(iter != games.end())
{
games.erase(iter);
cout <<"\nGame deleted!";
}
else
{
cout<<"\nGame not found.";
}
continue;
}
else if (action == "find")
{
cout <<"Which game you want to look for in your library: ";
cin >> newGame;
getline (cin, newGame);
iter = find(games.begin(), games.end(), newGame);
if (iter != games.end())
{
cout << "Game found.\n";
}
else
{
cout << "Game not found.\n";
}
continue;
}
else if (action == "game")
{
srand(static_cast<unsigned int>(time(0)));
random_shuffle(games.begin(), games.end());
cout << "\nWhy don't you play " << games[0];
continue;
}
else if (action == "quit")
{
cout <<"\nRemember to have fun while gaming!!\n";
break;
}
else
{
cout <<"\nCommand not found";
}
}
return 0;
}
答案 0 :(得分:1)
我不知道你写的是什么,但是:
getline
将在您的案例newGame
cin >> newGame;
时,您首先使用istream operator >>
string
。它会一直读到第一个分隔符。在您的情况下,这是Tomb
和Raider
cin >> newGame;
覆盖使用getline
读取的值。在getline
值Tomb
之前,后面的内容变为Raider
只需删除cin
:
cin >> newGame;
getline (cin, newGame);
- &GT;
getline (cin, newGame);
编辑现在,当您发布所有代码时,我确信您的案例正是我的想法。在行cin >> action;
中,您提示用户选择操作。他进入并点击进入,这样他就可以让你的程序再次活跃起来。但是,cin >>
将读取值,但不清除输入用户按下的值。因此,您调用的第一个getline
将只读取此输入而不是其他内容。如果你这样做:
cin >> newGame;
getline (cin, newGame);
- &GT;
cin.get();
getline (cin, newGame);
这会奏效。我尝试过这个。基本上第一个cin.get();
清除了输入,getline
提示用户输入。
EDIT2 在处理上添加一个改进后续新行。这可能是处理它们的最正确方法,但我故意不提供此解决方案,试图不将OP与复杂代码混淆:
if (cin.peek() == '\n' || cin.peek() == '\r') {
cin.get();
}
getline (cin, newGame);
答案 1 :(得分:1)
混合
cin >> value1;
和
getline(cin, value2);
正在招来麻烦。问题是getline
读取直到下一个'\ n'(并消耗它),而>>
读取直到下一个空格(并且不消耗它)。
这意味着当您通过value1
阅读>>
时,新行字符仍保留在流中,然后您尝试读取整行并读取“无”({1}将使用作为流的直接输入的换行符。)
将getline
加倍的建议可行,但只有在您通过另一个分支中的getline
阅读时,它才会中断,因为getline
消耗了新行,与此相反getline
,但没有。
我建议您通过>>
处理所有输入,然后对读取字符串进行标记,如果需要进一步处理的话。这样,您可以确保新行处理是一致的,并且还可以正确读取空格。
答案 2 :(得分:0)
请你试试这个:
cout <<"Type the name of the game you want to add: ";
而不是你的代码:
cout <<"\nType the name of the game you want to add: ";
我不确定它是否有效。但是请试一试。
答案 3 :(得分:0)
问题可能是因为流浪'\ n'。 getline顾名思义获取完整行的值。那么你的编译器如何知道你何时完成。它使用字符\n
。如果它读取左边\n
,它将假定该行已经结束,所以如果你删除它我认为它应该工作。所以只是在getline之前找到可能已经留下一个流浪的行\ n。< / p>