C++学生信息录入程序中变量自动被赋值为空的问题排查
问题分析与解决方案
嘿,这个问题我太熟了!你遇到的第一个name被赋值为空字符串的问题,根源在于**cin和gets()混用导致的输入缓冲区残留问题**。
问题到底出在哪?
当你用cin >> Rno[i](或者其他cin >>操作)输入数据时,你按下的回车键会留下一个**换行符\n**在输入缓冲区里。接下来调用gets(name[i])时,它会直接读取这个换行符作为输入内容,所以第一个name就变成了空字符串。而且这个问题会在每次循环里重复出现,只是第一次的表现最明显。
另外还要提醒你:gets()是一个不安全的函数(已经被C11标准废弃,C++里更不推荐使用),它不会检查输入的长度,很容易导致缓冲区溢出。
解决方案:两种修复思路
思路1:清理cin后的缓冲区换行符
在每次cin操作之后,手动清空缓冲区里的换行符,这样gets()就能正常读取输入了。你可以用cin.ignore()来实现:
#include <iostream> #include <stdio.h> #include <limits> // 需要包含这个头文件来使用numeric_limits using namespace std; class Data { public: int Rno[3], phy[3], mat[3], chem[3]; char name[3][100]; void getInfo() { for(int i = 0; i < 3; i++) { cout << "Enter your name: "; gets(name[i]); cout << "Enter your Roll number: "; cin >> Rno[i]; cout << "Enter your Physics marks: "; cin >> phy[i]; cout << "Enter your Maths marks: "; cin >> mat[i]; cout << "Enter your Chemistry marks: "; cin >> chem[i]; // 清空缓冲区里的所有字符,直到遇到换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } }; }; int main() { Data d; d.getInfo(); puts(d.name[0]); // 现在可以正常输出第一个名字了 return 0; }
思路2:改用C++风格的输入(更推荐)
直接抛弃C语言的gets()和puts(),用C++的getline()和cout,同时把char数组换成更安全的string类型:
#include <iostream> #include <string> // 包含string头文件 using namespace std; class Data { public: int Rno[3], phy[3], mat[3], chem[3]; string name[3]; // 用string代替char数组 void getInfo() { for(int i = 0; i < 3; i++) { cout << "Enter your name: "; // 直接用getline读取整行名字 getline(cin, name[i]); cout << "Enter your Roll number: "; cin >> Rno[i]; cout << "Enter your Physics marks: "; cin >> phy[i]; cout << "Enter your Maths marks: "; cin >> mat[i]; cout << "Enter your Chemistry marks: "; cin >> chem[i]; // 同样需要清空缓冲区的换行符,避免下一次getline读取空内容 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } }; }; int main() { Data d; d.getInfo(); cout << d.name[0] << endl; // 用cout输出string return 0; }
额外提示
- 如果你在程序开头第一次调用
getline()前没有用cin,就不需要ignore(),但这里循环里每次cin后都要处理换行符。 string类型比char数组更安全、更易用,能自动管理内存,避免缓冲区溢出问题,推荐在C++代码里优先使用。
内容的提问来源于stack exchange,提问作者Vatsal Dattani
相关产品推荐
相关产品推荐

