超过8个字符的字符串会导致无限循环C ++

时间:2017-06-02 15:31:29

标签: c++ string vector

我的C ++代码存在问题,而且我还没有在网上发现任何描述为什么我遇到此问题的内容。这是我的代码:

/*
Write a program using vectors and iterators that allows a user to main-
tain a list of his or her favorite games. The program should allow the
user to list all game titles, add a game title, and remove a game title.
*/

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<string> gamesList;
    gamesList.reserve(10);
    vector<string>::const_iterator iter;
    string menu = "1. List all games\n";
    menu += "2. Add a game title\n";
    menu += "3. Remove a game title\n";
    menu += "4. Quit\n";
    string newTitle = "", removeTitle = "";
    int choice = 0;

    while (choice != 4)
    {
        cout << menu;
        cout << "\nYour choice: ";
        cin >> choice;
        switch (choice)
        {
            case 1:
                for (iter = gamesList.begin(); iter != gamesList.end(); ++iter)
                {
                    cout << *iter << endl;
                }
                cout << "\nList capacity is " << gamesList.capacity() << endl;
                break;
            case 2:
                cout << "Please enter a game title :";
                cin >> newTitle;
                gamesList.push_back(newTitle);
                break;
            case 3:
                cout << "Which game title do you want to remove?\n";
                cin >> removeTitle;
                for (int i = 0; i < gamesList.size(); ++i)
                {
                    if (gamesList[i] == removeTitle)
                    {
                        gamesList.erase(gamesList.begin() + i);
                    }
                }
                break;
            case 4:
                cout << "Good bye!";
                break;
        }
    }
    return 0;
}

如果我运行该程序并输入Pong,Breakout和Tetris列表,它可以正常工作。如果我运行程序并输入半条命或任何超过8个字符的标题,程序将进入无限循环。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

问题不在于长度,而是您尝试在其中输入带有空格的名称。输入操作符>>在空格上分隔。因此,如果您输入Half Life作为名称,则输入操作符只会读取Half

您可能应该使用std::getline来阅读名称。

至于无限循环,这是因为由于名称的一部分仍然在输入缓冲区中(带有前导空格),所以当您尝试读取菜单项的数字时,输入将失败,保留输入缓冲区,你将无法检测它并进入一个无限循环,你想要读取整数,失败,打开和打开......

使用std::getline将解决这两个问题。但是如果你想确保不再发生这种情况,你必须在读取菜单替代的整数时添加一些错误检查。这可以简单地类似于

while (!(cin >> choice))
{
    // Input of menu alternative failed, ignore input until the end of the line
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

An std::istream::ignore reference

答案 1 :(得分:0)

对于初学者,您应该包含标题<string>,因为程序中的标题使用了声明。

#include <string>

此代码段从向量中删除元素

       case 3:
            cout << "Which game title do you want to remove?\n";
            cin >> removeTitle;
            for (int i = 0; i < gamesList.size(); ++i)
            {
                if (gamesList[i] == removeTitle)
                {
                    gamesList.erase(gamesList.begin() + i);
                }
            }

错了。

首先根据作业你必须只删除一个元素。 要删除元素,您可以使用只有一个语句而不需要任何循环

#include <algorithm>

//...

gamesList.erase( std::find( gamesList.begin(), gamesList.end(), removeTitle ) );

至于你的问题,oprator >>输入字符,直到遇到空白字符。您应该使用函数getline而不是运算符。考虑到您还需要使用成员函数ignore从输入bu = ffer中删除换行符。