2017-04-21 4 views
3

Je crée un algorithme qui génère des nombres (nombres comme des chaînes) de 0 à 9999 et recherche sa fréquence dans un tableau a [50000].Erreur lors de l'impression d'une chaîne

char key[4]; 
    int freq; 
    for (int i = 0; i < 10000; i++) { 
    sprintf(key,"%04i",i); // save 4 digits in key, if i <1000 save leading 0's 
    freq = BruteForceStringMatch(key,a,n); //n length of a. 
    printf("%s-%i\n",key,freq); 
    } 
    free(a); 

mais, quand je lance le programme, je l'obtiens.

. 
. 
. 
9845-7 
9846 
-10 
9847-4 
9848-5 
-139 
9850-3 
9851-6 
9852-5 
9853-4 
9854-2 
9855-7 
9856-5 
9857-4 
9858-5 
9859 -9 
9860-3 

. 
. 
. 
9968-6 
9969 -9 
9970-5 
9971-4 
9972-7 
9973-6 
9974-6 
9975-2 
9976-7 
9977-4 
9978-2 
9979-7 
9980-3 
9981-4 
9982-3 
9983 -9 
9984-6 
9985-7 
998-8 
9987 -9 
9988-3 
9989 -9 
9990-4 
9991-3 
9992-5 
9993-2 
9994 -9 
9995-5 
9996-6 
9997-7 
9998-7 

Il y a des onglets dans la position de randoms, parfois le dernier chiffre de la clé est éliminé et il y a 139113, etc que je ne sais pas d'où ils viennent. J'utilise gcc version 5.4.0 (GCC) et le compile avec Windows 10 et le terminal babun.

Plus d'informations:

BruteForceStringMatch recherche la fréquence de la clé dans un.

int BruteForceStringMatch(char key[4], char* a, int length){ 
    int freq=0; 
    int k; 
    for (int j = 0; j < length -4; j++) { 
    k =0; 
    while(k <4 && key[k] == a[j+k]) 
     k=k+1; 
    if(k == 4) 
     freq++; 
    } 
    return freq; 
} 

Je reçois un d'un fichier avec 5000 chiffres.

FILE *inputfile; 
    char c; 
    int largo = 0; 
    char *a = (char *)malloc(50000*sizeof(char *));; 
    char *b = (char *)malloc(50000*sizeof(char *));; 
    inputfile = fopen("archivo_1.tex", "r"); 
    if (inputfile == NULL) { 
     fprintf(stderr, "Failed to open the file.\n"); 
     exit(1); 
    } 
    if (inputfile) { 
     for (int i=0; (c = getc(inputfile)) != EOF; i++){ 
      a[i] = c; 
      //putchar(a[i]); 
      largo++; 
     } 
     fclose(inputfile); 
    } 
+3

Nous avons besoin de suffisamment de code pour reproduire le problème. –

+0

Pouvez-vous également publier la définition de 'BruteForceStringMatch'? –

+0

Veuillez poster un [mcve]. – kaylum

Répondre

0

Il me semble que votre problème est que vous avez défini « clé » pour être seulement quatre caractères, quand il devrait être de cinq - quatre chiffres , plus le caractère nul. Alors que null finit dans le premier octet de "freq" ... alors quand vous définissez "freq" dans la ligne 5, cette valeur est vue par printf (sur la ligne 6) comme faisant partie de la chaîne "key". En particulier, vous pouvez le voir dans la sortie pour les valeurs 9859 et 8859, où la valeur de "freq" se trouve être 9, qui est le code ASCII pour un onglet. En outre, pour la valeur 9846 et "freq" est 10, qui se trouve être la valeur ASCII pour linefeed (ie, newline), et sur 9849, où "freq" est 13, qui est un retour chariot, donc "-13" imprime sur les trois premiers caractères de 9849.