我正在编写一个程序,它计算文本文件每一行中各种字母的出现次数。我通过学校网站这样做,它可能运行与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;
}
答案 0 :(得分:1)
如果c
不是字母,则此行可能会导致分段错误:
pismena[c-'A']++;
解决问题的一种方法:
if (c >= 'A' && c <= 'Z') {
pismena[c-'A']++;
}
答案 1 :(得分:1)
在对阵列使用c
索引之前,您应该测试[c-'A']
是否介于“A”和“Z”之间。