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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:28:34