C 打印直方图时出现分割错误

C 打印直方图时出现分割错误,c,kernighan-and-ritchie,C,Kernighan And Ritchie,我想问这个问题:“写一个程序来打印输入中单词长度的直方图”(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

我想问这个问题:“写一个程序来打印输入中单词长度的直方图”(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]);
}
#包括
无效读取(字符输入[]);
无效提款(int i[]);
main()
{
int i,k,l;
int len[16];
字符输入[100];
读取(输入);
i=k=l=0;
对于(l=0;l
此外:

a
应为
int
类型,而不是
char
。有关说明,请参阅以下内容:


我注意到的一个错误是在函数
read
中的
for(l=0;l中,您没有检查输入的长度,因此如果您的输入大于
c
中的条目数,您将在不属于您的内存中写入

编辑:

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

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

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

此行包含错误:

while(input[i]!='/0')
并使代码访问不属于程序的内存

应该是:

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

由于字符串终止字符为“\0”。

您可能希望使用调试器,并至少向我们提供有关错误代码的更多信息:o@Papergay对不起,我对c有点陌生,我该怎么做?我只是在linux终端上工作。在谷歌上搜索例如“gdb教程”。与您的问题无关,但您可能希望避免为自己的函数使用名称
read
。系统中已存在具有该名称的函数。取!和。和。和,这个,和这个。您是对的,只需将代码更改为int[16]但问题仍然存在。@Vicky也看到了答案的第二部分。你说的都做了,还是一样的错误。无论如何,谢谢你,我会尝试调试,但我在运行时只键入大约4个单词,所以应该没问题,不是吗?@Vicky,只要这些单词少于99个字符。@Vicky用(现在)更新了我的答案答案很明显。谢谢,是的,它确实给出了警告。'\0'和'/0'@Vicky
'\0'
之间的区别是什么?'\0'
是一个单一字符,即所谓的空终止符,用于终止字符串(显然您已经知道).
“/0”
是两个不同的字符,在一个字符中文字是不合法的。伙计,你是金子。很抱歉以前没有看到你的评论。我的意思是它现在可以工作了,干杯。
while(input[i]!='/0')
while(input[i]!='/0')
while(input[i]!='\0')