Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.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_Segmentation Fault_Fault - Fatal编程技术网

C 分割失败?为什么?

C 分割失败?为什么?,c,segmentation-fault,fault,C,Segmentation Fault,Fault,我会将包含一个或多个Pascal字符串的二进制文件转换为.Txt文件。这是正确的方法,但它似乎是一个分段错误。我不明白,哪里出了问题。文件大小是23 void printFile(char *buffer, char *output_file, int file_size) { FILE *out_file = fopen(output_file, "w"); int i = 0; int j = 1; int cnt = 0; int cnt_word = 0; int

我会将包含一个或多个Pascal字符串的二进制文件转换为.Txt文件。这是正确的方法,但它似乎是一个分段错误。我不明白,哪里出了问题。文件大小是23

void printFile(char *buffer, char *output_file, int file_size)
{
  FILE *out_file = fopen(output_file, "w");
  int i = 0;
  int j = 1;
  int cnt = 0;
  int cnt_word = 0;
  int block = 4;

  while (i < block)
  {
    cnt = cnt + buffer[i];
    i++;
  }

  while (j <= cnt)
  {
    while (i < file_size)
    {
      while (i < (i + block))
      {
        cnt_word = cnt_word + buffer[i];
        i++;
      }

      while (i < (i + cnt_word))
      {
        fprintf(out_file, "%c", buffer[i]);
        i++;
      }

      fprintf(out_file, " ");
      cnt_word = 0;
      j++;
    }
  }

  fclose(out_file);
}
while(i<(i+块))
这里的块是4,我看不出这个条件如何在(I

时失败

这里的块是4,我看不出这种情况如何会失败

IIRC pascal字符串以长度作为第一个字节来存储,而不像C字符串那样以终止\0来存储

为了显示字符串,需要使用十六进制编辑器检查文件中的确切格式


但是,您可以首先使用calloc将缓冲区设置为\0,然后将文本放入其中,以确保缓冲区是\0终止的。

IIRC pascal字符串的存储长度为第一个字节,而不是像C字符串那样以终止的\0存储

为了显示字符串,需要使用十六进制编辑器检查文件中的确切格式


但是,您可以首先使用calloc将缓冲区设置为\0,然后将文本放入其中,以确保缓冲区\0终止。

您没有显示调用函数,因此我们不知道“缓冲区”的大小。您很可能超出了数组大小。在调试器中运行它。缓冲区有多大?还有这么多while循环,我只能想象其中一个无限运行会导致堆栈溢出。while(I<(I+block))这种情况会失败吗?@sukunt good catch。我刚才说的其中一个while循环很可能会导致堆栈溢出,如果它运行无穷大如果param file_size小于4,则存在无穷大循环!“while(iI>(INT\u MAX-block)中失败。因为,他正在访问循环中的数组,我会说它将在它之前发生segfault。我会说它在
I>(INT\u MAX-block)
中失败。因为,他在访问循环中的数组,我会说它将在它之前发生segfault。
fseek(in_file, 0, SEEK_END);
file_size = ftell(in_file);
rewind(in_file);

//allocate memory for buffer
buffer = malloc(file_size);
while (i < (i + block))