C++按指定原型递归反转字符串丢失最后一个字符问题求解
问题原因
- 你当前的递归逻辑完全没有修改传入的
letters引用:你递归时传入的是局部变量t的引用,所有递归操作都作用在临时字符串上,原入参不会有任何变化,不符合给定函数原型的设计要求。 - 如果你的需求是在
reverse函数内部直接打印反转结果,当前代码逻辑本身可以输出完整反转内容,出现丢字符的情况,基本是两个原因导致:- 实际运行代码的递归终止条件被误写为
letters.size() == 1,长度为1的字符串会直接返回,跳过了首字符打印 - 你在调用
reverse函数后,额外打印了未被修改的原字符串,导致输出内容混淆
- 实际运行代码的递归终止条件被误写为
符合要求的正确实现
如果你需要reverse函数直接修改入参完成字符串反转,实现代码如下:
void reverse(string & letters){ // 递归终止:长度小于等于1的字符串无需反转 if (letters.size() <= 1) { return; } // 交换首尾字符 swap(letters[0], letters[letters.size()-1]); // 提取中间待反转子串 string mid_part = letters.substr(1, letters.size() - 2); // 递归反转中间子串 reverse(mid_part); // 把反转后的中间子串替换回原字符串 letters.replace(1, letters.size() - 2, mid_part); }
如果你的需求是仅在reverse函数内部打印反转结果,不需要修改原字符串,保持原有逻辑即可,注意调用后不需要再额外打印原字符串:
void reverse(string & letters){ if (letters.empty()){ return; } string t = letters.substr(1); reverse(t); cout << letters[0]; }
内容的提问来源于stack exchange,提问作者Ian Rogers。
相关产品推荐
相关产品推荐

