2013-02-16 65 views
3

我試圖計算字典中的詞的開始字母的頻率,其中包含cca 140 000字。我保存的數組中的頻率計數,計數[0]爲字母a,計數[1]爲字母b ...但是,當我總結數組計數時,該值不等於詞典中的單詞總數。我發現如果我將字典大小縮小到95137,數字就相等,但只要字典超過95137個字,count [0]到count [4]的值突然變得非常大。我不知道爲什麼..這裏是我的代碼:數組 - 價值跳

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(void) 
{ 
    FILE *fp = fopen("testdic.txt", "r"); 
    int count[26]; 
    char buffer[30]; 
    for (int i = 0; i < 26; i++) 
     count[i] = 0; 
    int total = 0; 
    while (1) 
    { 
     fscanf(fp, "%s", buffer); 
     if (feof(fp)) 
      break; 
     count[buffer[0]-97] ++; 
     total++; 
     if (count[0] > total)   // I used this to find out where the jump occurs 
      break; 
    } 
    printf("%d ", i); 
    for (int i = 0; i < 26; i++) 
     printf("%d " , count[i]); 

} 
+2

堆棧粉碎? 96k整數是400-800kB。如果你有1MB的堆棧,那麼... – 2013-02-16 14:47:57

+0

在嘗試將它用作數組索引之前,在'buffer [0] -97'上放置一些邊界檢查。 – 2013-02-16 15:09:59

回答

3

很難知道爲什麼這段代碼會產生奇怪的輸出,因爲你忘記了幾次調試檢查。

  • feof只有在讀取功能失敗時才能使用;
  • 你不檢查fopen返回值;
  • 你不檢查scanf返回值;
  • 你不檢查buffer[0]值;
  • 你不檢查buffer長度%s
0

不知道這是不是問題,但你的代碼應該關心的話是否對他們有奇怪的字符。 所以,簡單地做

count[buffer[0]-97] 

有點魯莽,如果你問我!在執行該行之前,我會確保buffer[0] >=97 & buffer[0]<97+26。否則,誰知道你在遞增!

- 難道你的第95138個單詞是從一個有趣的角色開始的嗎?

1

在這份聲明中count[buffer[0]-97] ++;你正在考慮通過取首字母的ASCII值,然後減去a 97即ASCII值推導出指數。我不知道您是否打算處理以大寫字母開頭的單詞,如Ascii,其中buffer[0]爲65,表達式buffer[0] - 97的計算結果爲負整數。這可能會導致堆棧損壞。

0

你的total變量是在你的count數組之後聲明的 - 所以當你超出數組的範圍時,你就搞亂了所有的東西。一個小於'a'的字符會特別糟糕 - 但坦率地說,第一個大寫字母就足夠了。使用count[(buffer[0]-'a')%26]++ - 模塊將迫使您留在陣列中。這是一個騙局,但如果這樣的作品,你可以開始尋找壞字符。