【问题标题】:Segmentation fault for a particular case特定情况的分段错误
【发布时间】:2020-06-18 08:02:30
【问题描述】:

我正在编写一个将编辑字符串的代码。但是,我的代码对输入“zzzzzzzzzz”给出了分段错误。我无法弄清楚分段错误背后的原因。

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
 {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;cin>>t;
while(t--)
{
    string s;cin>>s;
    int l=s.size();
    int i=1;
    cout<<l;
    //s.erase(s.begin()+5);
    while(i<(l-1))
    {
        cout<<i<<" ";
        s.erase(s.begin()+i);
        i=i+2;
    }
    cout<<s<<endl;
}
//code
return 0;

【问题讨论】:

标签: c++


【解决方案1】:

您似乎希望这段代码

while(i<(l-1))

将阻止您尝试删除 s 中不存在的字符。但请记住,l 是原始字符串的大小,在循环中您会逐渐缩短字符串。我猜你真正需要的是

while(i+1<s.size())

这样您就始终针对s 的最新大小进行测试。

请注意while(i&lt;s.size()-1) 不是很好,因为s.size() 是一个无符号整数。如果字符串大小为零,则s.size()-1 将导致无符号溢出,循环不会终止。

【讨论】:

    【解决方案2】:

    您遇到分段错误,因为每次您的字符串大小都会减小并且您尝试访问超出范围的部分 (s.erase(s.begin()+i);) 这个语句来纠正这个问题只需在它之前添加一个 if 语句就像

    if(s.begin()+i !=s.end())
    s.erase(s.begin()+i);
    

    这将确保您不会越界

    【讨论】:

      猜你喜欢
      • 2020-04-27
      • 1970-01-01
      • 2016-06-25
      • 2013-07-03
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      相关资源
      最近更新 更多