0

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

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

#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

4 回答 4

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应该是 typeint而不是char。看这里的解释:

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

于 2012-08-19T11:58:02.713 回答
0

此行包含错误:

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

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

它应该是:

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

因为以 char 结尾的字符串是 '\0'。

于 2012-08-19T12:40:01.313 回答
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.

于 2012-08-19T11:59:21.817 回答
0

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

编辑:

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

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

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

于 2012-08-19T12:09:27.480 回答