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

C++中如何解决按下回车后setter函数自动填充变量的问题?

问题分析与解决

核心问题

  1. 输入截断与类型不匹配导致cin失效:
    使用cin >>读取字符串时,会在空格、回车等空白字符处停止读取。若输入的电影标题/导演姓名包含空格,后续内容会被错误分配给下一个变量;更关键的是,如果输入非整数内容给year或runTime,cin会进入错误状态,所有后续输入操作直接跳过,导致剩余变量被赋予默认值,程序看似提前结束。
  2. 代码遗漏输入逻辑:
    setInfo函数里的runTime;是无意义的空语句,完全没有读取用户输入到该变量中。

修正方案

方案1:读取带空格的完整字符串(推荐)

使用getline读取包含空格的完整内容,同时处理cin错误状态和残留的换行符:

#include <iostream>
#include <string>
#include <limits>  // 用于清空输入缓冲区
using namespace std;

class MovieData
{
private:
    string title, director;
    int year, runTime;

public:
    void setInfo()
    {  
        cout << "Movie title: ";
        // 忽略之前输入残留的换行符,避免getline直接读取空行
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        getline(cin, title);
        
        cout << "Director: ";
        getline(cin, director);
        
        cout << "Year: ";
        // 循环处理整数输入错误,直到用户输入有效内容
        while (!(cin >> year)) {
            cin.clear();  // 重置cin的错误状态
            cin.ignore(numeric_limits<streamsize>::max(), '\n');  // 清空错误输入内容
            cout << "请输入有效的整数年份:";
        }
        
        cout << "Running Time: ";
        while (!(cin >> runTime)) {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "请输入有效的整数时长:";
        }
    }
    void displayInfo ()
    {
        cout << "Movie title: " << title << endl;
        cout << "Director: " << director << endl;
        cout << "Year: " << year << endl;
        cout << "Run Time: " << runTime << endl;
    }
};

int main() {
    MovieData movie1, movie2;

    movie1.setInfo();
    movie2.setInfo();

    movie1.displayInfo();
    movie2.displayInfo();

    return 0;
}

方案2:保留cin >>并处理错误

如果不需要读取带空格的字符串,只需确保输入错误时恢复cin状态:

void setInfo()
{  
    cout << "Movie title: ";
    cin >> title;
    
    cout << "Director: ";
    cin >> director;
    
    cout << "Year: ";
    while (!(cin >> year)) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "请输入整数年份:";
    }
    
    cout << "Running Time: ";
    while (!(cin >> runTime)) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "请输入整数时长:";
    }
}

额外注意事项

  • 原代码遗漏了<string>头文件,虽然部分编译器会间接引入,但显式包含可保证兼容性。
  • 修正了原代码中的拼写错误:Diector改为Director,Runnign Time改为Running Time。

内容的提问来源于stack exchange,提问作者Sergio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:04:03