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

C++实现字符串连续去重时无法直接cout输出ans的原因是什么

问题根本原因

  • 你定义的string ans是默认初始化的空字符串,初始长度为0,std::string的[]运算符不会自动扩容,直接通过下标赋值、包括最后执行的ans[n]='\0'都属于越界非法访问,触发C++未定义行为,是输出异常的核心诱因。另外std::string会自动维护末尾的\0终止符,完全不需要手动添加。
  • std::string的有效长度由内部成员变量单独记录,你直接通过下标修改内存不会更新这个长度值,调用cout<<ans时,程序读取到的字符串长度仍然是0,自然只会输出空内容。
  • 你手动循环遍历下标输出能正常打印,只是刚好踩到了std::string短字符串优化(SSO)的预分配缓冲区,这块内存暂时可读写,但这种逻辑完全不可靠,遇到长字符串、换编译器运行都可能直接崩溃。

修正方案

将下标赋值改为调用push_back()方法,该方法会自动扩容字符串、更新内部长度计数,修改后可正常输出结果,修正后的参考代码如下:

#include<iostream>
#include<string>
using namespace std;
int main(){
    string s;
    getline(cin,s);
    // 额外兼容空输入场景,避免访问s[0]触发越界
    if(s.empty()){
        cout<<endl;
        return 0;
    }
    string ans;
    ans.push_back(s[0]);
    for(int i=1; i<s.size(); i++){
        if(s[i]!=s[i-1]){
            ans.push_back(s[i]);
        }
    }
    cout<<ans<<endl;
    return 0;
}

内容的提问来源于stack exchange,提问作者Martens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:24:10