在运行以下代码时获取分段代码

时间:2012-01-04 15:34:27

标签: c++ segmentation-fault

请在这里帮助我....下面给出的程序显示分段错误....我不知道它有什么问题..

Runtime Error: SEG
Description: Segmentation fault
Runtime: 0.1

(程序运行时总会显示......)

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int main()
{
    char sent[1000][80],reqd[1000][80],temp[80];
    unsigned int i,j,k=0,l=0,n,num=0;
    cin>>n;
    for(i=0; i<n; i++)
    {
        cin.getline(sent[i],80);
    }
    for(j=0; j<n; j++)
    {
        for(i=0; i<strlen(sent[j]); i++)
        {
            while(sent[j][i]!=' '&&sent[j][i]!='\0')
            {
                reqd[l][k]=sent[j][i];
                i++;
                k++;
            }
            reqd[l][k]='\0';
            l++;
            k=0;
        }
    }
    for(i=0; i<=l; i++)
    {
        for(j=0; j<l-i-1; j++)
        {
            if(strcmp(reqd[j],reqd[j+1])>0)
            {
                strcpy(temp,reqd[j+1]);
                strcpy(reqd[j+1],reqd[j]);
                strcpy(reqd[j],temp);
            }
        }
    }
    num=l;
    for(i=0; i<l; i++)
    {
        if(strcmp(reqd[i],reqd[i+1])==0)
        {
            reqd[i][0]=' ';
            num--;
        }
    }
    cout<<num<<"\n";
    for(i=0; i<l; i++)
    {
        if(reqd[i][0]!=' ')
        {
            cout<<reqd[i]<<"\n";
        }
    }
    return 0;
}

请帮我找到问题....

4 个答案:

答案 0 :(得分:2)

每当你在C / C ++中看到一个分段错误时,你应该首先考虑指针问题(或等效的数组问题。)在这种情况下,我是一个超出你的字符数组长度的美元,因为你把它当作一个字符串处理,但读取的字符串大小与你的字符串长度相同。请记住,由于终结符字符,C字符串总是比字符串长度多一个字节。

答案 1 :(得分:2)

可能是由于cin.getline(sent[i],80);,您没有考虑空字符。

答案 2 :(得分:2)

崩溃的直接原因是这个循环:

for(i=0; i<=l; i++)
{
    for(j=0; j<l-i-1; j++)

在上一次迭代中,l-i-1的值应为-1;但是,由于这些是无符号的,因此结果会回绕到一个非常大的正值,并且循环永远不会退出。相反,它会通过内存直到达到无效地址并崩溃。

一些可能的修复方法是:

  • 将计数器的类型更改为int
  • 将循环终止条件更改为j+1<l-i
  • j<l-i期间从1循环,并更改循环以将sent[j-1]sent[j]进行比较。

另外,如果您读取的初始号码本身应该在一行上,那么您需要在阅读之后致电cin.ignore();否则,你会得到一个不需要的空行作为你的第一个输入。

但是如果您打算使用C ++,我建议您学习如何使用标准库,特别是std::string等类,std::vector等容器,以及{{{}等算法。 1}}。使用C风格的字符串和固定长度的缓冲区搞乱会导致像这样的错误。

这样的事情可以做同样的事情,但错误的范围更小:

std::sort

答案 3 :(得分:1)

不要混用

cin >> variable;

cin.getline()

cin不会删除新行,因此稍后您的getline会读取它。

而不是

cin.getline(sent[i],80);

尝试

cin >> sent[i];