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

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本身是动态长度类型,没有原生固定大小的能力,但可以通过两层限制实现长度控制:

  1. 输入时限制读取长度:引入<iomanip>头文件,使用setw控制最大读取字符数
#include <iomanip>
// 修改getData中的输入逻辑
cout << "Enter Owner : ";
cin >> setw(21) >> owner; // 最多读取20个有效字符(最后一位存'\0')
  1. setter中增加校验逻辑:在赋值前截断超长输入,避免外部直接修改成员变量时绕过长度限制
void setOwner(string o)
{
    if (o.length() > 20) {
        o = o.substr(0,20);
        // 也可以在这里增加输入超长的提示
    }
    this->owner = o;
}

如果完全需要固定大小的字符串,也可以改用char owner[21]类型的成员变量,天然固定长度。


内容的提问来源于stack exchange,提问作者codeplayer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:18:01