【问题标题】:Segmentation fault after using for loop [closed]使用for循环后出现分段错误[关闭]
【发布时间】:2015-08-01 13:18:49
【问题描述】:

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

#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;
    }
}

【问题讨论】:

  • "如果 for 循环有问题,那么它至少应该在循环开始之前显示一些输出。"实际上标准并没有要求,这是未定义行为的魔力(但在这种情况下,可能是因为 cout 缓冲区尚未刷新)
  • 您真正想解决什么问题?在 C++ 中很少需要编写这样的循环——很可能一个算法或一组算法函数可以完成这项工作,从而导致代码少得多。其次,在循环内增加 i 而不检查它是否超出了数组的范围。

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


【解决方案1】:
while(s[i]!=' ')
  {
       curr_len=curr_len+1;
       i=i+1;
  }

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

【讨论】:

  • 我已经编辑了这个问题。我认为它应该至少打印 len 。
  • @facebook-100003312828525 查看我对您问题的评论,std::cout 不会在您每次尝试写入内容时刷新缓冲区。
  • 谢谢@Caninonos。我使用 cin.ignore() 清除任何缓冲区。
  • 我想的是更像std::cout &lt;&lt; len &lt;&lt; std::flush; 我不认为std::cin::ignore 刷新std::cout 的缓冲区
  • @facebook-100003312828525: cin.ignore() 与“清除任何缓冲区”无关(无论如何,“清除”与“刷新”相反),与 std::cout 无关.你的len 被困在std::cout 的缓冲区中,你的程序从来没有机会执行它的自动刷新,因为它首先崩溃了。
【解决方案2】:

问题在于您没有在嵌套的 while 循环中测试 i 是否越界:

例如:

  while (s[i] != ' ')

应该是:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2023-04-08
    • 1970-01-01
    • 2015-08-09
    相关资源
    最近更新 更多