C ++循环错误,我的教授无法弄清楚

时间:2015-12-10 03:06:12

标签: c++ database vector

我目前正在学习C ++编程课程并正在开发一个项目,我必须在其中创建一个相当简单的电影数据库。我的代码基本上按预期工作,但在某些情况下,它会导致主菜单无限循环,我无法弄清楚原因。我把它带给了我的老师,他也无法解释。他给了我一个解决方法,但我想知道是否有人能看出问题的原因。完整代码如下:

#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>

using namespace std;

struct MovieType
{
    string title;
    string director;
    int year;
    int length;
    string rating;
};

MovieType addMovie() {
    MovieType newMovie;

    cout << "Movie title        :";
    getline(cin, newMovie.title);
    cout << "Director           :";
    getline(cin, newMovie.director);
    cout << "Year               :";
    cin >> newMovie.year;
    cout << "Length(in minutes) :";
    cin >> newMovie.length;
    cout << "Rating             :";
    cin >> newMovie.rating;
    cout << endl;

    return newMovie;
}

void listMovie(MovieType movie) {
    cout << "______________________________________" << endl;
    cout << "Title        : " << movie.title << endl;
    cout << "Director     : " << movie.director << endl;
    cout << "Released     : " << movie.year << endl;
    cout << "MPAA Rating  : " << movie.rating << endl;
    cout << "Running time : " << movie.length << " minutes" << endl;
    cout << "______________________________________" << endl;
}

void search(vector<MovieType> movieVector) {
    string strSearch;
    cout << endl << "Search title: ";
    getline(cin, strSearch);
    for (int c = 0; c < movieVector.size(); c++) {
        if (movieVector.at(c).title == strSearch)
            listMovie(movieVector.at(c));
    }
}

int main() {
    bool quit = 0;
    vector<MovieType> movieVector;

    while (quit == 0) {
        char selection = 'f';

        cout << "Main Menu:" << endl;
        cout << "'a' - Add movie" << endl;
        cout << "'l' - List movies" << endl;
        cout << "'s' - Search by movie title" << endl;
        cout << "'q' - Quit" << endl;
        cout << "Please enter one of the listed commands:";
        cin >> selection;
        cin.ignore();
        cout << endl;
        if (selection == 'a')
            movieVector.push_back(addMovie());
        else if (selection == 'l') {
            for (int c = 0; c < movieVector.size(); c++) {
                listMovie(movieVector.at(c));
            }
        }
        else if (selection == 's') {
            search(movieVector);
        }
        else if (selection == 'q')
            quit = 1;

    }
    return 0;
}

当在addMovie函数期间输入意外的输入类型时(比如输入int类型年份的文本),它只是在函数中运行,然后无限循环遍历菜单。在我看来,即使查看输入流,代码也会停止。我曾尝试在许多不同的地方使用cin.ignore(),但如果流中没有任何内容它就会继续下去并不重要。 我正在使用NetBeans来编译我的代码。 我真的不知道它为什么会这样,否则我会提供更多的信息,但我只是好奇为什么会这样,因为正如我之前所说,我的教授甚至不知道为什么会这样。 非常感谢任何帮助或见解。

1 个答案:

答案 0 :(得分:4)

cin进入cin.fail()为真的错误状态。在这种状态下,它只是忽略所有输入操作。一个修复是清除错误状态,但更好的是,只对getline使用cin操作,而不是格式化输入。

,而不是

cin >> newMovie.year;

...做

newMovie.year = stoi( line_from( cin ) );

...其中line_from可以定义为

auto line_from( std::istream& stream )
    -> std::string
{
    std::string result;
    if( not getline( stream, result ) )
    {
        // Throw an exception or call exit(EXIT_FAILURE).0
    }
    return result;
}

免责声明:编码器未触及代码。