C++程序二次调用read_data()函数无法提示输入问题求助
问题排查:C++两次调用read_data函数第二次无法提示输入
程序代码
头文件
#include <iostream> #include <algorithm> #include <cmath> #include <cstdlib> #include <string> #include <iomanip> #include <limits> // 修复需要新增的头文件 using namespace std;
read_data函数(原版本)
float* read_data(int& size){ int a_size = 0; static float a[10]; float* temp = a; cout << "Please enter values, and press 'Q' when finished: "; for (int i = 0; i < size; i++){ cin >> a[i]; if (cin.fail()){ break; }else{ a_size++; } } cin.clear(); size = a_size; return temp; }
主函数
int main(){ int size1 = 10; int size2 = 10; int size3 = 0; float array[10]; float addarray[10]; float longarray[20]; float* ptr = array; float* addptr = addarray; float* longptr = longarray; cout << fixed << setprecision(2); ptr = read_data(size1); cout << setw(15) << "Original array" << setw(5) << "=" << setw(5) << "{ " << *ptr; for (int i = 0; i < size1; i++){ cout << ", " << *(ptr + i); } cout << " }" << endl; for (int i = 0; i < size1; i++){ *(longptr + size3) = *(ptr + i); size3++; } addptr = read_data(size2); for (int i = 0; i < size2; i++){ *(longptr + size3) = *(addptr + i); size3++; } cout << setw(15) << "New array" << setw(5) << "=" << setw(5) << "{ " << *longptr; for (int i = 0; i < size3; i++){ cout << ", " << *(longptr + i); } cout << " }" << endl; return 0; }
问题描述
程序功能:通过read_data()函数提示用户输入最多10个浮点数组成数组并打印;再次调用该函数获取第二个数组,合并两个数组后打印。但两次调用read_data()时,第一次能正常提示输入,第二次无法触发输入提示,调整cin.clear()和cin.ignore()的使用后仍未解决。
问题根源
第一次输入结束时,用户输入的终止符Q及后续换行符会残留在输入缓冲区中。原代码仅用cin.clear()清除了cin的错误状态,但未清空缓冲区里的无效字符。第二次调用read_data()时,cin会直接读取缓冲区中残留的Q,立即触发cin.fail(),导致输入循环直接终止,用户看不到输入提示。
修复方案
修改read_data()函数,在cin.clear()之后添加cin.ignore()清空输入缓冲区的残留字符:
float* read_data(int& size){ int a_size = 0; static float a[10]; float* temp = a; cout << "Please enter values, and press 'Q' when finished: "; for (int i = 0; i < size; i++){ cin >> a[i]; if (cin.fail()){ break; }else{ a_size++; } } cin.clear(); // 清空输入缓冲区直到换行符,清除残留的无效字符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); size = a_size; return temp; }
修复说明
cin.ignore(numeric_limits<streamsize>::max(), '\n')会跳过输入缓冲区中直到换行符的所有字符,彻底清空第一次输入后残留的无效内容,确保第二次调用read_data()时,输入缓冲区处于空状态,能够正常提示用户输入。
内容的提问来源于stack exchange,提问作者Ivonne Hartono
相关产品推荐
相关产品推荐

