Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印字符串时出错_C_Search_Printf_Frequency - Fatal编程技术网

C 打印字符串时出错

C 打印字符串时出错,c,search,printf,frequency,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 le

我正在创建一个算法,生成从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);
有标签在随机位置,有时键的最后一位被删除,还有139113,等等,我不知道它们来自哪里。我正在使用gcc版本5.4.0(gcc),并使用Windows10和终端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;
}

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

我们需要足够的代码来复制该问题。您是否也可以发布
BruteForceStringMatch
的定义?请发布一个。您正在使用
char键[4]
并尝试为该数组分配4个字符。您没有为字符串结尾留任何空间。将您的字符数组大小增加到5,还记得删除分配的内存。在您的
if(inputfile==NULL)
中,您应该调用
free(a)
免费(b)退出之前。
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;
}
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);
  }