C++实现字符串首尾字符交换代码输出异常问题求助
问题分析
- 缺少必要头文件:操作
std::string需要引入<string>头文件,部分编译器未隐式包含该头文件时会直接编译失败。 - 存在多余无效输入逻辑:你的需求是交换字符串本身的首尾字符,不需要额外输入两个字符,代码中
cin >> pr1、cin >> pr2属于冗余逻辑,还会导致程序运行时等待额外输入,和需求不符。 - 循环逻辑完全冗余:你编写的for循环仅遍历字符串不断覆盖
pr1、pr2的值,最终仅能拿到字符串的首、尾字符,不需要遍历操作,直接通过下标取对应位置字符即可。 - 字符串拼接逻辑错误:你将尾字符、完整原字符串、首字符直接拼接,相当于在原字符串前后分别新增尾字符和首字符,完全没有实现交换效果,这是输出异常的核心原因。
- 缺少边界判断:如果输入字符串为空或长度为1,直接取下标
0和length()-1会出现内存越界错误。
修改后代码
版本1:直接修改原字符串(推荐,写法简洁高效)
#include <iostream> #include <string> using namespace std; int main() { string sentence; getline(cin, sentence); // 长度小于2的字符串不需要交换 if (sentence.size() >= 2) { // 直接调用标准库swap方法交换首尾字符 swap(sentence[0], sentence[sentence.size() - 1]); } cout << sentence; return 0; }
版本2:保留原字符串,生成新的输出字符串
#include <iostream> #include <string> using namespace std; int main() { string sentence; getline(cin, sentence); string output; if (sentence.size() < 2) { output = sentence; } else { // 拼接规则:尾字符 + 去掉首尾的中间字符串 + 首字符 output = sentence.back() + sentence.substr(1, sentence.size() - 2) + sentence.front(); } cout << output; return 0; }
优化说明
- 补充了必要的
<string>头文件,保证全平台编译兼容。 - 移除了所有冗余变量和无效输入逻辑,代码结构更清晰。
- 增加了字符串长度边界判断,避免空字符串、单字符字符串的访问越界问题。
- 直接调用标准库方法实现需求,执行效率更高,可读性更好。
内容的提问来源于stack exchange,提问作者Keith
相关产品推荐
相关产品推荐

