2017-04-21 2 views
3

Ich erstelle einen Algorithmus, der Zahlen (Zahlen wie Zeichenfolgen) von 0 bis 9999 generiert und seine Häufigkeit in einem Array a [50000] sucht.Fehler beim Drucken einer Zeichenfolge

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

aber wenn ich das Programm ausführen, bekomme ich es.

. 
. 
. 
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 

Es gibt Registerkarten in Position randoms, manchmal die letzte Ziffer der Schlüssel eliminiert, und es gibt 139.113, etc, dass ich keine Ahnung, woher sie kommen. Ich verwende gcc Version 5.4.0 (GCC) und kompiliere es mit Windows 10 und dem Terminal babun.

Weitere Informationen:

BruteForceStringMatch die Häufigkeit des Schlüssels in einer Suche.

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; 
} 

Ich bekomme eine aus einer Datei mit 5000 Ziffern.

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

Wir brauchen genug Code, um das Problem zu replizieren. –

+0

Können Sie auch die Definition von 'BruteForceStringMatch' veröffentlichen? –

+0

Bitte poste ein [mcve]. – kaylum

Antwort

0

Es ist für mich das Problem scheint, dass Sie „Schlüssel“ definiert nur vier Zeichen sein, wenn es fünf sein sollte - vier Ziffern und die abschließende Null. Damit Null im ersten Byte von "freq" endet ... wenn Sie "freq" in Zeile 5 setzen, wird dieser Wert von printf (in Zeile 6) als Teil des "key" -Strings erkannt. Insbesondere können Sie dies in der Ausgabe für die Werte 9859 und 8859 sehen, wo der Wert von "freq" 9 ist, was der ASCII-Code für eine Registerkarte ist. Außerdem ist für Wert 9846 und "freq" 10, was zufällig der ASCII-Wert für Zeilenvorschub (dh Zeilenvorschub) ist, und bei 9849, wo "freq" 13 ist, was ein Wagenrücklauf ist, so dass "-13" gedruckt wird über die ersten drei Zeichen von 9849.

Verwandte Themen