C - 计算文件中字母的出现 - 错误139:分段错误

时间:2014-03-28 12:52:00

标签: c

我正在编写一个程序,它计算文本文件每一行中各种字母的出现次数。我通过学校网站这样做,它可能运行与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;
}

2 个答案:

答案 0 :(得分:1)

如果c不是字母,则此行可能会导致分段错误:

pismena[c-'A']++; 

解决问题的一种方法:

if (c >= 'A' && c <= 'Z') {
    pismena[c-'A']++; 
}

答案 1 :(得分:1)

在对阵列使用c索引之前,您应该测试[c-'A']是否介于“A”和“Z”之间。