打印字符串时出错

时间:2017-04-21 06:28:38

标签: c search printf frequency

我正在创建一个生成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位置有标签,有时键的最后一位数被消除,有139,113等,我不知道它们来自哪里。我正在使用gcc版本5.4.0(GCC)并使用Windows 10和终端babun进行编译。

更多信息:

BruteForceStringMatch搜索a。中键的频率。

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位的文件中得到一个。

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

1 个答案:

答案 0 :(得分:0)

在我看来,你的问题是你将“key”定义为只有四个字符,当它应该是五个 - 四个数字加上终止空值。因此null在“freq”的第一个字节中结束...然后当您在第5行中设置“freq”时,printf(第6行)会将该值视为“key”字符串的一部分。特别是,您可以在输出中看到值9859和8859,其中“freq”的值恰好是9,这是选项卡的ASCII代码。另外,对于值9846和“freq”是10,恰好是换行的ASCII值(即换行),在9849,其中“freq”是13,这是一个回车符,所以“-13”打印超过9849的前三个字符。