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

C++中使用下标运算符修改string后如何正确查看并保存修改内容

问题原因

你当前的代码触发了C++的未定义行为,根源在于:
你初始化的std::string是空对象,长度为0,合法的下标访问范围是[0, 字符串长度),空字符串没有任何合法可访问的下标。直接用str[0]、str[1]赋值属于越界操作,既不会自动触发字符串扩容,也不会把字符写入std::string管理的有效存储区域。
第二段代码能输出字符只是未定义行为的巧合:你直接输出的是越界访问到的临时内存值,这些值并没有被真正存入string对象,string本身的长度始终是0,所以第一段代码输出整个string的时候只会打印空串。这种写法非常不稳定,换编译环境甚至改个编译参数都可能直接崩溃。

正确实现方案

要通过下标运算符修改string的字符,只需要提前保证下标对应的位置属于string的合法存储范围即可,有以下几种常用方案:

方案1:初始化时预分配长度

创建string的时候直接指定你需要的长度,后续就可以正常用下标修改对应位置的字符:

char last = 'c';
// 初始化长度为2的字符串,初始填充字符可以随意,后续会被覆盖
string str(2, ' ');
for (int i = 97; i <= (int)last; i++)
{
    str[0] = (char)i;
    for (int j = 97; j <= (int)last; j++)
    {
        str[1] = (char)j;
        cout << str << endl;
    }
}

方案2:用resize方法动态调整长度

如果初始化时不知道需要的长度,可以先创建空字符串,后续调用resize分配对应长度的空间后再用下标访问:

char last = 'c';
string str;
// 调整字符串长度为2,分配对应存储空间
str.resize(2);
for (int i = 97; i <= (int)last; i++)
{
    str[0] = (char)i;
    for (int j = 97; j <= (int)last; j++)
    {
        str[1] = (char)j;
        cout << str << endl;
    }
}

额外提示

如果不确定下标是否合法,可以用str.at(下标)替代str[下标],越界时会主动抛出out_of_range异常,方便快速定位问题,避免出现莫名其妙的异常表现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:15:08