使用C++迭代器与STL reverse函数反转字符串单词时触发Segmentation Fault问题排查
解决C++原地反转字符串单词时的段错误问题
嘿,我一眼就瞅到你代码里触发段错误的原因了!咱们先来看你的实现代码:
#include <bits/stdc++.h> using namespace std; int main() { string s = "Hello world!"; for(string::iterator it = s.begin();it!=s.end();it++){ string::iterator st = it; while(st!=s.end() && *st!=' '){ st++; } reverse(it,st); it = st; } cout<<s; return 0; }
问题根源
问题出在for循环的迭代器更新逻辑上:
当你处理最后一个单词(比如例子里的world!)时,st会一直走到s.end()才停止循环。这时候你把it赋值为st(也就是s.end()),然后for循环会执行它的增量操作it++——这就踩坑了!s.end()是指向字符串末尾之后的迭代器,对它执行++操作会让它变成完全无效的迭代器,访问这个迭代器直接触发段错误。
修复方案
只需要在处理完单词后,判断一下st是否已经到达末尾,如果是,直接跳出循环,避免执行多余的it++:
#include <bits/stdc++.h> using namespace std; int main() { string s = "Hello world!"; // 去掉循环里的it++,手动控制迭代器移动更稳妥 for(string::iterator it = s.begin();it!=s.end();){ string::iterator st = it; while(st!=s.end() && *st!=' '){ st++; } reverse(it,st); if(st == s.end()){ // 到达末尾直接退出,避免越界 break; } it = st + 1; // 跳过空格,移动到下一个单词的开头 } cout<<s; return 0; }
额外补充
- 我把for循环里的
it++移到了循环体内手动控制,这样能更精准地控制迭代器位置,避免越界风险。 - 如果你的字符串存在开头/结尾空格、连续空格的情况,这个代码还需要额外处理(比如先跳过开头空格、合并连续空格等),但针对你当前的示例,上面的修复已经能正常运行,输出
olleH !dlrow。
内容的提问来源于stack exchange,提问作者MOHAN KUMAR R
相关产品推荐
相关产品推荐

