我目前正在学习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来编译我的代码。
我真的不知道它为什么会这样,否则我会提供更多的信息,但我只是好奇为什么会这样,因为正如我之前所说,我的教授甚至不知道为什么会这样。
非常感谢任何帮助或见解。
答案 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;
}
免责声明:编码器未触及代码。