好的,所以我想做这个问题:“编写一个程序来打印输入中单词长度的直方图”(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]);
}
答案 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
。请参阅此说明:
答案 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'。