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

