这是CS50-pset4恢复的解决方案。但为什么我得到分段错误? 我试图不访问任何未初始化文件的任何NULL指针,但无法找到出路。 目的是将512B内存块从给定文件复制到另一个文件,如果它匹配作为jpeg文件的条件。并且假设jpeg文件存储在连续的存储器位置中。 $
#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
int main(int argc, char *argv[])
{
// ensure proper usage
if (argc != 2)
{
fprintf(stderr, "Usage: copy infile outfile\n");
return 1;
}
// remember filename
char *infile = argv[1];
// open input file
FILE *inptr = fopen(infile, "r");
if (inptr == NULL)
{
fprintf(stderr, "Could not open %s.\n", infile);
return 2;
}
FILE *img = NULL;
unsigned char buffer[512] = {0};
//char *jpgname = NULL;
string jpegname = "";
int jpegnum = 0; // for keep track of jpeg no.
//sprintf(jpgname, "%03d.jpg", jpegnum+1);
//jpegnum += 1;
while (fread(buffer, 512, 1, inptr) == 1)
{
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff &&
((buffer[3] & 0xf0) == 0xe0))
{
if (jpegnum > 0) // if there exist a jpeg file, it should close first
{
fclose(img);
}
sprintf(jpegname, "%03d.jpg", (jpegnum+1));
jpegnum += 1;
img = fopen(jpegname, "w");
//fwrite(buffer, 512, 1, img);
}
else if (jpegnum == 0)
{
continue;
}
fwrite(buffer, 512, 1, img);
}
fclose(img);
fclose(inptr);
return 0;
}
$
答案 0 :(得分:1)
字符串文字""
已分配给jpegname
,并传递给sprintf()
。
这很糟糕,因为
""
只有1个元素(对于终止空字符),它也不足以保存文件名。尝试使用
char jpegname[512] = "";
而不是
string jpegname = "";
此更改将为jpegname
提供可修改的512字节缓冲区,这对于文件名就足够了。
另请注意,将img
的值NULL
传递给fclose()
应该是错误的。