getline不会让我打字,c ++

时间:2012-04-07 10:56:26

标签: c++ getline

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

答案 0 :(得分:1)

我不知道你写的是什么,但是:

  • getline将在您的案例newGame
  • 中的第二个参数中获取整行
  • 当您在获取线上方拨打cin >> newGame;时,您首先使用istream operator >> string。它会一直读到第一个分隔符。在您的情况下,这是TombRaider
  • 之间的空格
  • 后记用cin >> newGame;覆盖使用getline读取的值。在getlineTomb之前,后面的内容变为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>