You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++程序跳过列表名称输入直接执行类构造输入且无限循环问题

Netflix剧集数据收集程序问题修复

核心问题拆解

  1. 列表名称输入被跳过:程序开头的Series mySeries[MAX_SERIES];会直接初始化20个Series对象,每个对象的构造函数会立即触发输入流程,导致main函数中获取列表名称的代码还没执行就被跳过。
  2. 调试输出不显示:同上,构造函数的cout先于main中的调试cout执行,所以看不到"gets list name"这类输出。
  3. 无限循环:
    • cin读取数值(seasons/episodes/year)后,换行符会留在输入缓冲区,后续getline会直接读取这个空换行符,导致mRating和actors被设为空,但name始终有输入值,无法触发退出条件。
    • 循环逻辑错误:每次循环都直接给数组元素赋值新的Series对象,判断空名称的时机滞后,且数组元素被反复覆盖。

具体修复步骤

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

修复验证

  1. 程序启动后会先提示输入列表名称,不再直接进入剧集输入。
  2. 每次输入数值后,后续的getline能正确读取字符串,不会出现空值。
  3. 输入空剧集名称时,循环会正常退出,不会无限循环。
  4. 所有调试输出会按预期顺序显示。

内容的提问来源于stack exchange,提问作者crams.m2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:00:06