使用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
相关产品推荐
相关产品推荐

