C++字符串反转代码仅半部分生效,循环索引问题求助
字符串反转问题的修复方案
你的代码问题出在循环遍历了整个字符串长度,并且直接赋值覆盖了原字符。当循环进行到字符串的后半段时,你要替换的目标位置已经被前半段的替换操作修改过了,导致后半段无法正确取到原始的字符。比如输入Welcome(长度7):
- 前3次循环(chara=0,1,2):把第6、5、4位的字符赋值给0、1、2位,此时字符串变成
emoc+ome - 后续循环(chara=3到6):你试图把第3、2、1、0位的字符赋值给3、4、5、6位,但此时第2、1、0位已经是修改后的
o、m、e,所以赋值后后半段没有变化,最终得到emocome。
修复方案
要正确反转字符串,你需要:
- 只遍历字符串的前半部分,和后半段对应位置的字符交换
- 交换时用临时变量保存其中一个字符,避免被覆盖
手动交换的修正代码
#include <iostream> #include <string> using namespace std; int main(){ string line; cin >> line; int c = line.size(); // 直接用string的size()方法获取长度,无需手动循环计数 for (int chara = 0; chara < c / 2; chara++) { // 只遍历前半部分 // 保存原位置的字符,避免被覆盖 char temp = line[chara]; // 交换对应位置的字符 line[chara] = line[c - chara - 1]; line[c - chara - 1] = temp; } cout << line; return 0; }
更简洁的标准库写法
如果你想省去手动交换的逻辑,可以直接用C++标准库提供的reverse函数:
#include <iostream> #include <string> #include <algorithm> // 必须包含此头文件以使用reverse using namespace std; int main(){ string line; cin >> line; reverse(line.begin(), line.end()); // 直接调用reverse函数完成反转 cout << line; return 0; }
内容的提问来源于stack exchange,提问作者Sofia Gamiño
相关产品推荐
相关产品推荐

