打印直方图时出现分段错误

时间:2012-08-19 11:55:50

标签: c kernighan-and-ritchie

好的,所以我想做这个问题:“编写一个程序来打印输入中单词长度的直方图”(Brian和dennis ritchie编写的C编程练习1-13)。 在这段代码中,我只打印各种单词长度的计数(这是我的第一次尝试)。

这个程序编译得很好但是在运行代码时我收到了这个Segmentation fault(代码转储)错误。 这段代码出了什么问题?

#include<stdio.h>
void read(char input[]);
void draw(int i[]);
main()
{
    int i,k,l;
    int len[16];
    char input[100];
    read(input);
    i=k=l=0;
    for(l=0;l<=15;l++)
    {
        len[l]=0;
    }
    while(input[i]!='/0')
    {   
        if(input[i]!='\n'&&input[i]!='\t'&&input[i]!=' ')
        {   k++;
            i++;
        }
        else
        {   len[k]=len[k]+1;
            k=0;
            i++;    
        }
    }
    draw(len);
    return 0;
}

void read(char c[])
{
    int i=0;
    int a;
    while((a=getchar())!=EOF)
    {   c[i]=a;
        i++;
    }
    c[i]='\0';
}

void draw(int len[])
{   int i=0;
    printf("Length\tWords\n");
    for(i=1;i<=15;i++)
    printf("%6d\t%6d\n",i,len[i]);
}

4 个答案:

答案 0 :(得分:1)

for(l=0;l<=15;l++)
{
    len[l]=0;
}

您的数组类型为int [15],因此您正在访问数组外的元素。

此处draw函数中存在完全相同的问题:

for(i=1;i<=15;i++)

此外:

char a;
while((a=getchar())!=EOF)

a应为int类型,而不是char。请参阅此说明:

http://c-faq.com/stdio/getcharc.html

答案 1 :(得分:0)

我注意到的一个错误是for(l=0;l<=15;l++)。它应该是for(l=0;l<15;l++)

int len[15]表示len是大小为15的int数组,其有效位置为len[0], len[1], ... len[14],但您在这里访问len[15] undefined并可能导致segmentation fault {1}}。

答案 2 :(得分:0)

在函数read中,您不检查输入的长度,因此如果您的输入大于c中的条目数,您将在不属于您的内存中写入。< / p>

修改

在您检入调试器后,更容易搜索错误原因,如果您查看while循环,您将会非常清楚地看到它:

while(input[i]!='/0')

您将input中的字符与非法字符文字进行比较。您正在使用正斜杠,但它应该是反斜杠:'\0'。实际上,你应该发出关于多字符字符文字的警告。

答案 3 :(得分:0)

此行包含错误:

while(input[i]!='/0')

并使您的代码访问不属于您的程序的内存。

应该是:

while(input[i]!='\0')

字符串终止字符为'\ 0'。