【问题标题】:C++ loop error that my professor can't figure out我的教授无法弄清楚的 C++ 循环错误
【发布时间】:2015-12-10 03:06:12
【问题描述】:

我目前正在学习 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 编译我的代码。 我真的不知道为什么会这样,否则我会提供更多信息,但我只是好奇为什么会发生这种情况,因为正如我之前所说,我的教授甚至不知道为什么会发生这种情况。 非常感谢任何帮助或见解。

【问题讨论】:

    标签: c++ database vector


    【解决方案1】:

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

    例如,而不是

    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;
    }
    

    免责声明:编译器未修改代码。

    【讨论】:

    • 谢谢,这很有道理。我确实将它们全部更改为 getline 并且它有效,但现在我知道为什么它更有意义。基于此,似乎在大多数情况下使用 getline 会更好。你会说这是真的吗?还有我该如何清除错误状态?
    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多