C++两个字符串首字符交换失效,输出仍为'splendid day'如何解决
C++字符串首字符交换逻辑问题排查
错误根因梳理
- 手动交换的赋值流程完全错位:
原代码写的三步手动交换逻辑:
这段逻辑全程没有修改temporary = a[0]; b[0] = a[0]; b[0] = temporary;a[0]的值,连续两步都在给b[0]赋值,最终b[0]被覆盖为原a[0]的s,完全没有把b[0]的原首字符d赋值给a[0],交换的核心双向赋值流程缺了一半。 - 后续冗余的swap操作失效:
经过上面三步错误赋值后,a[0]还是原s,b[0]已经被改成和a[0]一样的s,此时执行swap(a[0], b[0])相当于两个相同值互换,没有任何实际效果,这也是最终输出和输入完全一致的直接原因。 - 变量类型定义不合理:
temporary被定义为string类型,用来暂存单个字符不符合语义,虽然能通过隐式转换编译,但容易引发逻辑混淆。 - 无意义的冗余代码:输入流程后添加的
cin.get()在当前逻辑下没有实际作用,既不会影响交换结果,也没有承担预期的捕获换行的功能,可以直接删除。
正确实现方案
完全可以省略手动写临时变量的流程,直接调用字符级别的swap完成需求,修正后最简代码如下:
#include <iostream> #include <string> using namespace std; int main() { string a, b; cout << "Input two words: " << endl; cin >> a >> b; // 直接交换两个字符串的首字符,无需手动写临时变量逻辑 swap(a[0], b[0]); cout << "The two words you entered are: " << a << " " << b << endl; return 0; }
如果需要手动实现交换逻辑,按照标准三变量交换流程修正即可:
char temp; temp = a[0]; a[0] = b[0]; b[0] = temp;
效果验证
输入splendid day时,代码会将首字符s和d互换,最终输出dplendid say,完全符合需求。
内容的提问来源于stack exchange,提问作者ConradP
相关产品推荐
相关产品推荐

