2013-02-16 6 views
3

Я пытаюсь подсчитать частоту начальных букв слов в словаре, который содержит около 140 000 слов. Я сохраняю частоты в массиве count, со счетом [0] для буквы a, count [1] для буквы b ... однако, когда я суммирую массив count, значение не равно общее количество слов в словаре. Я выяснил, что если я уменьшу размер словаря до 95137, числа будут равны, но как только словарь будет иметь более 95137 слов, значения count [0] до count [4] внезапно станут очень большими. Я понятия не имею, почему .. вот мой код:Array - Value Jump

#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

Stack smashing? 96k целых чисел - 400-800 КБ. И если у вас есть стек 1 МБ, то ... – 2013-02-16 14:47:57

+0

Поместите некоторую проверку границ на 'buffer [0] -97', прежде чем пытаться использовать его в качестве индекса массива. –

ответ

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 стартового письма и вычитая 97 т.е. ASCii значения a. Я не уверен, что вы собираетесь обрабатывать слово, начинающееся с прописной буквы, например Ascii, где buffer[0] равно 65, а выражение buffer[0] - 97 оценивает отрицательное целое число. Это может привести к повреждению стека.

0

Ваша total переменная объявляется сразу после вашего массива count - поэтому, когда вы выходите за пределы массива, вы все испортили. Характер менее «а» был бы особенно плохим, но, откровенно говоря, первой заглавной буквы достаточно. Используйте count[(buffer[0]-'a')%26]++ - модульное подразделение заставляет вас оставаться в массиве. Это kluge, но если это сработает, вы можете начать искать плохих персонажей.