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

使用cin.getline读取char pointer时程序崩溃的问题求助

解决cin.getline读取char*时程序崩溃的问题

哥们,你这个问题我太熟了——十有八九是char*没分配内存导致的野指针问题!咱们一步步捋清楚:

为啥会崩溃?

cin.getline(char* str, int n)的要求很明确:str必须指向一块已经分配好的、至少能装下n个字符(包括末尾的终止符\0)的内存。如果你只是声明了char* firstname;却没给它分配内存,那它就是个野指针,指向的是随机的内存地址,往里面写数据肯定会触发内存访问错误,直接崩给你看。而你的dob能正常工作,应该是你给它分配了合法的内存空间(比如定义成数组或者用new分配了)。

靠谱的解决办法

给你三种方案,按需选:

方案1:用固定大小的char数组(最简单直接)

直接把firstname和lastname定义成数组,内存自动在栈上分配,不用手动管理:

#include <iostream>
using namespace std;

const int MAXTXT = 80;

int main() {
    char firstname[MAXTXT];
    char lastname[MAXTXT];
    char dob[MAXTXT];

    cout << "Enter first name: ";
    cin.getline(firstname, MAXTXT);
    cout << "Enter last name: ";
    cin.getline(lastname, MAXTXT);
    cout << "Enter DOB: ";
    cin.getline(dob, MAXTXT);

    cout << "Name: " << firstname << " " << lastname << endl;
    cout << "DOB: " << dob << endl;
    return 0;
}

方案2:手动用new分配堆内存(必须用char*时)

如果一定要用char*指针,那必须先给它分配内存,用完记得释放,避免内存泄漏:

#include <iostream>
using namespace std;

const int MAXTXT = 80;

int main() {
    // 分配能容纳MAXTXT个字符的内存
    char* firstname = new char[MAXTXT];
    char* lastname = new char[MAXTXT];
    char* dob = new char[MAXTXT];

    // 检查内存分配是否成功(虽然现代系统很少失败,但好习惯不能丢)
    if (!firstname || !lastname || !dob) {
        cerr << "Memory allocation failed!" << endl;
        return 1;
    }

    cout << "Enter first name: ";
    cin.getline(firstname, MAXTXT);
    cout << "Enter last name: ";
    cin.getline(lastname, MAXTXT);
    cout << "Enter DOB: ";
    cin.getline(dob, MAXTXT);

    cout << "Name: " << firstname << " " << lastname << endl;
    cout << "DOB: " << dob << endl;

    // 释放数组内存,必须用delete[],不能用delete!
    delete[] firstname;
    delete[] lastname;
    delete[] dob;
    return 0;
}

方案3:用std::string(C++首选,省心又安全)

其实在C++里,除非有特殊的老代码兼容需求,否则强烈推荐用std::string处理字符串。它会自动帮你管理内存,完全不用操心分配释放,配合getline用起来巨简单:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string firstname, lastname, dob;

    cout << "Enter first name: ";
    getline(cin, firstname);
    cout << "Enter last name: ";
    getline(cin, lastname);
    cout << "Enter DOB: ";
    getline(cin, dob);

    cout << "Name: " << firstname << " " << lastname << endl;
    cout << "DOB: " << dob << endl;
    return 0;
}

额外踩坑提醒

如果之前用cin >>读取过数字(比如int、float),然后直接用cin.getline,会触发换行符残留的问题——cin >>会留下输入后的换行符,导致getline直接读到空字符串。这时候要先用cin.ignore()跳过这个换行符:

int age;
cout << "Enter age: ";
cin >> age;
cin.ignore(); // 跳过age输入后留下的换行符
cout << "Enter first name: ";
cin.getline(firstname, MAXTXT);

内容的提问来源于stack exchange,提问作者Me myself and I

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:54:36