使用for循环后的分段错误

时间:2015-08-01 13:18:50

标签: c++ string stl segmentation-fault getline

下面是我的代码。如果我对for循环进行注释,但是当我添加for循环时它运行得非常好,它会给出一个分段错误,甚至在for循环之前的代码也没有显示任何输出。 如果for循环中有错误,那么它应该至少在循环开始之前显示一些输出。 在这里我使用getline因为我的字符串包含空格。 附:我的错误在循环中,我可能不仅仅是字符串长度,但是在循环开始之前它与分段错误有什么关系,它应该至少打印长度。

#include<iostream>
#include<string>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string s;
        cin.ignore();
        getline(cin,s,'\n');
        int len=s.length();
        cout<<len;
        int curr_len=0;
        int prev_len=0;;
        int count=1;
        int max=1;
        for(int i=0;i<len;i++)
        {
            cout<<s[i];
            while(s[i]!=' ')
            {
                curr_len=curr_len+1;
                i=i+1;
            }
            if(curr_len==prev_len)
            {
                count=count+1;
                if(count>max)
                    max=count;
            }
            else
            {
                count=1;
            }
            while(s[i]==' ')
            {
                i=i+1;
                prev_len=curr_len;
                curr_len=0;
            }
        }
        cout<<s<<endl;
    }
}

2 个答案:

答案 0 :(得分:2)

while(s[i]!=' ')
  {
       curr_len=curr_len+1;
       i=i+1;
  }

我认为这是你的问题。 想想当s [i]是行的结尾时会发生什么。

答案 1 :(得分:1)

问题在于你没有测试嵌套i循环中while越界:

例如:

  while (s[i] != ' ')

应该是:

  while (s[i] != ' ' && i < len)

假设i几乎位于输入字符串的末尾,并且输入字符串中没有空格字符,从i指向的位置开始。这个while循环将继续运行,直到找到空格字符。这可能是超过字符串长度的数百个,甚至数千个字节。

将此更改应用于此while循环以及您未进行此检查的所有其他更改后,程序应该运行(结果是否正确是一个不同的故事)。