C++自定义字符串反转函数调用返回"结果异常问题求助
问题原因
- 下标访问越界触发未定义行为:
C++std::string的合法下标范围为0到str.length() - 1,你代码中的循环从str.length()开始遍历、直到-1结束:首先str[str.length()]是字符串末尾的隐式终止符\0,不属于有效业务内容;其次str[-1]是字符串起始地址前的非法内存,读取结果完全不可控。你遇到的返回空串的现象,本质就是第一个写入结果的字符是\0,多数测试框架按C风格字符串判断返回值时,遇到\0就会判定为字符串为空。 - 全局变量未清空导致结果异常:
你把存储结果的result定义为全局变量,每次调用函数时不会自动清空,不仅多次调用会出现结果累加的问题,全局变量初始残留的未知内容也可能干扰输出结果。你观察到的std::cout输出符合预期属于未定义行为的巧合表现,不代表逻辑正确。
修复方案
- 将
result改为函数内部的局部变量,每次调用自动初始化为空字符串,避免跨调用污染。 - 调整循环下标范围,从最后一个合法下标
str.length() - 1开始遍历,到第一个合法下标0停止。
修复后代码如下:
#include <iostream> #include <string> using namespace std; string reverseString (string str) { string result; for(int i = str.length() - 1; i >= 0; i--) { result += str[i]; } cout << result; return result; }
如果不需要手动实现反转逻辑,也可以直接调用标准库算法简化代码:
#include <iostream> #include <string> #include <algorithm> using namespace std; string reverseString (string str) { reverse(str.begin(), str.end()); cout << str; return str; }
内容的提问来源于stack exchange,提问作者Person。
相关产品推荐
相关产品推荐

