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
相关产品推荐
相关产品推荐

