C++限制字符串长度20、构造初始化及对象数组崩溃问题咨询
C++代码问题解答
1. 构造函数中初始化长度为20的string成员
std::string支持传入初始长度和默认字符的构造方法,推荐使用构造函数初始化列表实现,效率比构造函数体内赋值更高:
// 修改构造函数如下 House(string o="", string addr="", int bdr = 0, float p = 0.0) : owner(20, '\0'), address(addr), bedrooms(bdr), price(p) { // 如果需要用传入的owner覆盖初始值,可增加长度判断后赋值 if (o.length() > 20) o = o.substr(0,20); owner = o; }
如果只需要预留20个字符的空间、不需要初始填充,可调用owner.reserve(20)实现。
2. 程序崩溃原因排查
崩溃的核心原因是野指针访问:
你在main函数中定义了House *h[100],这是一个包含100个House类型指针的数组,所有指针未初始化,指向非法内存地址,直接调用h[time]->getData()就会触发内存访问错误崩溃。
同时代码缺少数组越界防护,当输入超过100条数据时会访问数组外的空间。
修复方案
方法1:改用对象数组(无需手动管理内存,更简单)
// 把main中的指针数组改为对象数组 House h[100]; // 后续调用改为 h[time].getData(); h[time].display();
方法2:保留指针数组,使用前初始化指针
do { h[time] = new House(); // 先创建对象,给指针赋值 h[time]->getData(); h[time]->display(); // ...原有逻辑 time++; } while (time < 100 && (yesorno == 'y' || yesorno =='Y')); // 增加越界判断 // 程序结束前释放内存避免泄漏 for(int i=0; i<time; i++) { delete h[i]; }
另外你的getData方法存在冗余操作:直接给成员变量owner赋值后又调用setOwner(owner),属于重复操作,可删除其中一处。
3. 限制string输入长度不超过20的方法
std::string本身是动态长度类型,没有原生固定大小的能力,但可以通过两层限制实现长度控制:
- 输入时限制读取长度:引入
<iomanip>头文件,使用setw控制最大读取字符数
#include <iomanip> // 修改getData中的输入逻辑 cout << "Enter Owner : "; cin >> setw(21) >> owner; // 最多读取20个有效字符(最后一位存'\0')
- setter中增加校验逻辑:在赋值前截断超长输入,避免外部直接修改成员变量时绕过长度限制
void setOwner(string o) { if (o.length() > 20) { o = o.substr(0,20); // 也可以在这里增加输入超长的提示 } this->owner = o; }
如果完全需要固定大小的字符串,也可以改用char owner[21]类型的成员变量,天然固定长度。
内容的提问来源于stack exchange,提问作者codeplayer
相关产品推荐
相关产品推荐

