C++程序跳过列表名称输入直接执行类构造输入且无限循环问题
Netflix剧集数据收集程序问题修复
核心问题拆解
- 列表名称输入被跳过:程序开头的
Series mySeries[MAX_SERIES];会直接初始化20个Series对象,每个对象的构造函数会立即触发输入流程,导致main函数中获取列表名称的代码还没执行就被跳过。 - 调试输出不显示:同上,构造函数的cout先于main中的调试cout执行,所以看不到"gets list name"这类输出。
- 无限循环:
- cin读取数值(seasons/episodes/year)后,换行符会留在输入缓冲区,后续getline会直接读取这个空换行符,导致
mRating和actors被设为空,但name始终有输入值,无法触发退出条件。 - 循环逻辑错误:每次循环都直接给数组元素赋值新的Series对象,判断空名称的时机滞后,且数组元素被反复覆盖。
- cin读取数值(seasons/episodes/year)后,换行符会留在输入缓冲区,后续getline会直接读取这个空换行符,导致
具体修复步骤
1. 延迟Series对象的创建
保留数组声明但不在开头初始化,改为在循环中创建临时对象,验证有效后再存入数组,避免程序启动时就触发20次输入流程。
2. 修复cin与getline的输入冲突
每次用cin >>读取数值后,调用cin.ignore(numeric_limits<streamsize>::max(), '\n');清空输入缓冲区的换行符,确保后续getline能正确读取用户输入(需包含<limits>头文件)。
3. 调整循环逻辑
先创建临时Series对象,判断其名称是否为空,若为空则退出循环;若有效再存入数组,同时提前校验数组容量,避免越界。
4. 移除不必要的cin.ignore()
删除main函数开头无意义的cin.ignore(),避免提前消耗输入缓冲区的内容。
修改后的代码示例
main.cpp
#include <iostream> #include <string> #include <limits> // 用于清空输入缓冲区 #include "Series.h" using namespace std; int main() { const int MAX_SERIES = 20; Series mySeries[MAX_SERIES]; string listName; // 先获取列表名称 cout << "输入剧集列表名称:" << endl; getline(cin, listName); cout << "列表名称为:" << listName << endl; int currentSeries = 0; while (true) { cout << "开始录入新剧集(直接回车结束录入):" << endl; Series tempSeries; // 创建临时对象 if (tempSeries.getName().empty()) { break; } // 验证数组容量 if (currentSeries >= MAX_SERIES) { cout << "已达到最大剧集数量上限" << endl; break; } mySeries[currentSeries] = tempSeries; currentSeries++; } // 输出结果 cout << "\n--- " << listName << " ---" << endl; for (int i = 0; i < currentSeries; ++i) { cout << "剧集名称:" << mySeries[i].getName() << endl; cout << "类型:" << mySeries[i].getGenre() << endl; cout << "季数:" << mySeries[i].getSeasons() << endl; cout << "集数:" << mySeries[i].getEpisodes() << endl; cout << "上映年份:" << mySeries[i].getYear() << endl; cout << "分级:" << mySeries[i].getMRating() << endl; cout << "演员:" << mySeries[i].getActors() << "\n" << endl; } return 0; }
Series.h(修改Setter函数,处理输入缓冲区)
#include <iostream> #include <string> #include <limits> // 新增头文件 // #include "Actor.h" // 若未实现可暂时注释 using namespace std; class Series { public: Series(); void setName(); void setGenre(); void setSeasons(); void setEpisodes(); void setYear(); void setMRating(); void setActors(); string getName(); string getGenre(); int getSeasons(); int getEpisodes(); int getYear(); string getMRating(); string getActors(); private: string name; string genre; int seasons; int episodes; int year; string mRating; string actors; }; Series::Series() { setName(); if (!name.empty()) { // 名称为空时不再执行后续输入 setGenre(); setSeasons(); setEpisodes(); setYear(); setMRating(); setActors(); } } void Series::setName() { cout << "输入剧集名称:" << endl; getline(cin, name); } void Series::setGenre() { cout << "输入剧集类型:" << endl; getline(cin, genre); } void Series::setSeasons() { cout << "输入季数:" << endl; cin >> seasons; cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空换行符 } void Series::setEpisodes() { cout << "输入集数:" << endl; cin >> episodes; cin.ignore(numeric_limits<streamsize>::max(), '\n'); } void Series::setYear() { cout << "输入上映年份:" << endl; cin >> year; cin.ignore(numeric_limits<streamsize>::max(), '\n'); } void Series::setMRating() { cout << "输入分级:" << endl; getline(cin, mRating); } void Series::setActors() { cout << "输入演员:" << endl; getline(cin, actors); } // Getter函数保持不变 string Series::getName() { return name; } string Series::getGenre() { return genre; } int Series::getSeasons() { return seasons; } int Series::getEpisodes() { return episodes; } int Series::getYear() { return year; } string Series::getMRating() { return mRating; } string Series::getActors() { return actors; }
修复验证
- 程序启动后会先提示输入列表名称,不再直接进入剧集输入。
- 每次输入数值后,后续的getline能正确读取字符串,不会出现空值。
- 输入空剧集名称时,循环会正常退出,不会无限循环。
- 所有调试输出会按预期顺序显示。
内容的提问来源于stack exchange,提问作者crams.m2
相关产品推荐
相关产品推荐

