0

我尝试获取用户选择的游戏名称并将其存储在向量中。我使用 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;

}
4

4 回答 4

1

我不明白你到底写了什么,但是:

  • getline在您的情况下,将在其第二个参数中获取整行newGame
  • 当您cin >> newGame;在 getline 上方调用时,您首先使用istream operator >>of string。它一直读取到第一个分隔符。在您的情况下,这是和之间的Tomb空间Raider
  • cin >> newGame;之后,您使用覆盖读取的值getline。直到getline值是Tomb,之后它变成Raider

只需删除cin

cin >> newGame;
getline (cin, newGame);

->

getline (cin, newGame);

编辑现在,当您发布所有代码时,我确信您的情况正是我所想的。在该行中cin >> action;,您提示用户选择一个操作。他进入它并点击进入,这样他就可以让你的程序再次激活。但是,cin >>将读取该值,但不会清除用户按下的输入。因此,getline您调用的第一个将只读取此输入,仅此而已。如果你这样做:

cin >> newGame;
getline (cin, newGame);

->

cin.get();
getline (cin, newGame);

这将起作用。我尝试过这个。基本上第一个cin.get();清除输入并getline提示用户输入。

EDIT2在处理尾随新行的布局上添加了一项改进。这可能是处理它们的最正确方法,但我故意不提供此解决方案,以免将 OP 与复杂代码混淆:

   if (cin.peek() == '\n' || cin.peek() == '\r') {
      cin.get();
   }
   getline (cin, newGame);
于 2012-04-07T11:01:20.433 回答
1

混合

cin >> value1;

getline(cin, value2);

正在招惹麻烦。问题是getline读取到下一个 '\n' (并消耗它),而>>读取到下一个空白(并且不消耗它)。

这意味着当您读取value1via时>>,换行符仍保留在流中,然后您尝试读取整行并读取“无”(这getline将消耗作为流的直接输入的换行符)。

加倍的建议getline将起作用,但只有在您在另一个分支中阅读 viagetline时,它才会中断,因为这getline会消耗换行符,与 相反>>,它不会。

getline如果需要进一步处理,我建议您通过 处理所有输入,然后标记读取的字符串。这样,您可以确保换行处理是一致的,并且可以正确读取空格。

于 2012-04-07T11:25:15.317 回答
0

你能试试这个:

cout <<"Type the name of the game you want to add: ";

而不是你的这段代码:

cout <<"\nType the name of the game you want to add: ";

我不确定它是否有效。但请试一试。

于 2012-04-07T11:12:11.453 回答
0

问题可能是因为一个杂散的'\n'。顾名思义,getline 获取完整行的值。那么您的编译器如何知道您何时完成。它使用字符\n. 如果它读取一个left over \n,它将假设该行已经结束,所以如果你删除它我认为它应该可以工作。所以只需找出可能留下杂散\n的getline之前的行。

于 2012-04-07T11:22:05.673 回答