2017-04-21 16 views
3

0から9999までの数字(文字列のような数字)を生成するアルゴリズムを作成し、その頻度を配列a [50000]で検索しています。文字列を印刷中にエラーが発生する

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

しかし、私がプログラムを実行すると、私はそれを取得します。

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

私は、彼らがから来る見当がつかないrandoms位置にあるタブ、時にはキーの最後の桁がなくなると139113があるさ、などがあります。私はgccバージョン5.4.0(GCC)を使用していて、Windows 10とターミナルbabunでコンパイルしています。

詳細情報:

BruteForceStringMatchにキーの周波数を検索します。

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

私は5000桁のファイルからaを取得します。 4桁プラス終端ヌル - それはあなたの問題私には思える

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

問題を再現するのに十分なコードが必要です。 –

+0

'BruteForceStringMatch'の定義を投稿することはできますか? –

+0

[mcve]を投稿してください。 – kaylum

答えて

0

は、あなたはそれが5であるべきときにのみ、4つの文字であることを「キー」を定義していることです。その結果、nullは "freq"の最初のバイトで終了します...そして、5行目に "freq"を設定すると、その値は "key"文字列の一部としてprintf(6行目)に見えます。特に、9859と8859の値の出力でこれを見ることができます。 "freq"の値はタブのASCIIコードである9になります。また、値9846では "freq"は10で、改行(改行)のASCII値、9849では "freq"が13(キャリッジリターン)であるため "-13"が出力されます

関連する問題