C 分割失败?为什么?
我会将包含一个或多个Pascal字符串的二进制文件转换为.Txt文件。这是正确的方法,但它似乎是一个分段错误。我不明白,哪里出了问题。文件大小是23C 分割失败?为什么?,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
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(i
I>(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))