簡體   English   中英

C - 計算文件中字母的出現 - 錯誤139:分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM