C++中如何解决按下回车后setter函数自动填充变量的问题?
问题分析与解决
核心问题
- 输入截断与类型不匹配导致cin失效:
使用cin >>读取字符串时,会在空格、回车等空白字符处停止读取。若输入的电影标题/导演姓名包含空格,后续内容会被错误分配给下一个变量;更关键的是,如果输入非整数内容给year或runTime,cin会进入错误状态,所有后续输入操作直接跳过,导致剩余变量被赋予默认值,程序看似提前结束。 - 代码遗漏输入逻辑:
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
相关产品推荐
相关产品推荐

