3 votes

Tableau - Saut de valeur

J'essaie de compter la fréquence des premières lettres des mots d'un dictionnaire, qui contient environ 140 000 mots. J'enregistre les fréquences dans le tableau compter avec count[0] pour la lettre a, count[1] pour la lettre b ... cependant, lorsque j'additionne le tableau compter la valeur n'est pas égale au nombre total de mots du dictionnaire. J'ai découvert que si je réduis la taille du dictionnaire à 95137, les chiffres sont égaux, mais dès que le dictionnaire a plus de 95137 mots, les valeurs de count[0] à count[4] deviennent soudainement immensément grandes. Je ne sais pas pourquoi voici mon code :

#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]);

}

3voto

md5 Points 14957

Il est difficile de savoir pourquoi ce code produit des résultats étranges, car vous oubliez plusieurs vérifications de débogage.

  • feof ne doit être utilisé que si votre fonction de lecture échoue ;
  • vous ne vérifiez pas fopen valeur de retour ;
  • vous ne vérifiez pas scanf valeur de retour ;
  • vous ne vérifiez pas buffer[0] valeur ;
  • vous ne vérifiez pas buffer longueur en %s .

1voto

Ganesh Points 3964

Dans cette déclaration count[buffer[0]-97] ++; vous envisagez de dériver l'indice en prenant la valeur ascii de la lettre de départ et en soustrayant 97, c'est-à-dire la valeur ascii de a . Je ne suis pas sûr que vous ayez l'intention de traiter un mot commençant par une majuscule tel que Ascii donde buffer[0] est de 65 et l'expression buffer[0] - 97 donne un nombre entier négatif. Cela pourrait conduire à une corruption de la pile.

0voto

Sanjay Manohar Points 3612

Je ne sais pas si c'est le problème, mais votre code devrait se préoccuper de savoir si les mots contiennent des caractères impairs. Ainsi, en faisant simplement

count[buffer[0]-97] 

est un peu imprudent si vous voulez mon avis ! Je m'assurerais que buffer[0] >=97 & buffer[0]<97+26 avant d'exécuter cette ligne. Sinon, qui sait ce que vous incrémentez !

-- se pourrait-il que votre 95138ème mot commence par un caractère drôle ?

0voto

Floris Points 31305

Votre total est déclarée juste après votre count donc, lorsque vous sortez des limites du tableau, vous perturbez tout. Un caractère inférieur à 'a' serait particulièrement mauvais - mais franchement, la première lettre majuscule est suffisante. Utilisez count[(buffer[0]-'a')%26]++ - la division modulo vous oblige à rester dans le tableau. C'est un kluge mais si cela fonctionne, vous pouvez commencer à chercher les mauvais caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X