如何获取字符串中子串最后一个字符的索引?现有方法出现越界
解决字符串子串最后一个字符索引及
substr使用问题 首先,子串最后一个字符的正确索引计算方式是:子串首索引 + 子串长度 - 1。因为字符串索引从0开始,比如子串长度为3、首索引是5,那最后一个字符的索引就是5+3-1=7——直接加长度会得到8,这已经超出子串范围,自然会触发越界问题。
再看你写的代码,存在几个核心问题:
str2[str2.find(part2) + sizeOfPart2]是取字符串中的单个字符,但substr的第一个参数需要的是起始索引,你传错了参数类型。substr的第二个参数是截取的长度,你传的str2.find(part3)是part3的首索引,逻辑完全错误。- 那两段“长度为1就设为0”的代码完全没必要,反而会破坏正常的长度计算逻辑。
修正后的逻辑和代码示例如下:
size_t part2Start = str2.find(part2); size_t part3Start = str2.find(part3); // 先检查子串是否存在、位置顺序是否合理,避免无效计算 if (part2Start != string::npos && part3Start != string::npos && part2Start < part3Start) { // 计算part2最后一个字符的索引 size_t part2End = part2Start + part2.length() - 1; // 截取part2结束后到part3开始前的内容 string result = str2.substr(part2End + 1, part3Start - (part2End + 1)); cout << result << endl; } else { cout << "子串未找到或位置顺序错误" << endl; }
注意:必须判断find的返回值是否为string::npos,如果子串不存在,直接进行索引计算会导致程序异常。
内容的提问来源于stack exchange,提问作者Eduard Atoyan
相关产品推荐
相关产品推荐

