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