You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 21:04:05