C 打印直方图时出现分割错误
我想问这个问题:“写一个程序来打印输入中单词长度的直方图”(Brian和dennis ritchie编写的C编程书练习1-13)。 在这段代码中,我只打印不同字长的计数(这是我的第一次尝试) 这个程序编译得很好,但是在运行代码时,我得到了这个分段错误(代码转储)错误。 这个代码怎么了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
#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')