[英]C - counting occurance of letters in a file - Error 139: Segmentation fault
我正在编写一个程序,它计算文本文件每行中各种字母的出现次数。 我通过学校网站这样做,它可能运行与Visual Basic类似的调试器。 当我尝试提交代码时,我得到错误139:分段错误。 该程序在我自己的CodeBlocks测试中工作,但站点调试器遇到上述错误。
程序等待用户输入要检查的文件的名称。 文件的内容保存到数组“a”中。 变量“Riadok”是行计数器,“pismena”是存储字母出现计数的数组。 该程序检查每一行并打印出一个表格,显示在该行中找到每个字母的次数。
在提交过程中,网站会检查许多不同类型的输入,也许还有一些我还没有想到的东西。 有什么建议吗? 此外,我是一名初学者编码器,所以欢迎任何关于代码本身和改进的建议。
这是代码:
#include <stdio.h>
#include <ctype.h>
int main(){
int riadok=1, pismena[26],i;
char a[100],c='0';
FILE *fr;
for (i=0;i<=25;i++) pismena[i]=0;
scanf("%s",a);
fr= fopen(a, "r");
printf(" A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\n");
while ((c=getc(fr))!=EOF){
if(c!='\n') {
c=toupper(c);
pismena[c-'A']++;
}
else if(c=='\n') {
printf("%2d",riadok);
riadok++;
for (i=0;i<=25;i++){
printf(" %2d",pismena[i]);
pismena[i]=0;
c='0' ;
}
printf("\n");
}
}
printf("%2d",riadok);
riadok++;
for (i=0;i<=25;i++){
printf(" %2d",pismena[i]);
pismena[i]=0;
}
printf("\n");
fclose(fr);
return 0;
}
如果c
不是字母,则该行可能导致分段错误:
pismena[c-'A']++;
解决它的一种方法:
if (c >= 'A' && c <= 'Z') {
pismena[c-'A']++;
}
在对数组使用[c-'A']
索引之前,应测试c
是否在'A'和'Z'之间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.