我的C++程序未接收输入就终止,该如何排查解决?
解决C++程序未接收输入就终止的问题
嘿,我一眼就找到问题的根源了——你读取用户名的代码存在严重错误,导致程序触发了未定义行为,直接跳过年龄输入就终止了。
修复后的代码(针对char数组的修正)
#include <iostream> #include <string> using namespace std; class user{ int id,level=1,kills=0,age; char name[20],server[40]; public: void get(){ cout<<"Enter your name:"; cin>>name; // 关键修改:直接使用数组名,而非name[20] cout<<"Enter your age:"; cin>>age; } }; int main(){ user u; u.get(); return 0; }
错误原因详解
你原来的代码里写了cin>>name[20];,这犯了两个致命错误:
- 数组越界访问:
name是一个长度为20的char数组,合法索引范围是0~19,name[20]已经超出了数组的内存边界,属于未定义行为。这种操作可能会破坏栈上的其他变量(比如age的内存空间),或者直接搞乱输入流cin的状态。 - 错误的读取方式:要读取字符串到char数组中,你应该直接传递数组名
name——数组名在表达式中会自动转换为指向数组第一个元素的指针,cin会自动把输入的字符串存储到数组里(注意输入的名字长度不要超过19,因为需要留一个位置存放字符串结束符'\0')。
更安全的替代方案:使用std::string
如果你想彻底避免数组越界这类问题,推荐直接用C++的std::string来代替char数组,它会自动管理内存,使用起来更安全方便:
#include <iostream> #include <string> using namespace std; class user{ int id,level=1,kills=0,age; string name, server; // 用string替换char数组 public: void get(){ cout<<"Enter your name:"; cin>>name; cout<<"Enter your age:"; cin>>age; } }; int main(){ user u; u.get(); return 0; }
这样修改后,程序就能正常接收用户名和年龄的输入了。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

