CS50恢复分段故障
这是从pset4 CS50恢复。编译时没有错误。当我运行代码时,我得到了分段错误。我不明白到底是什么错误。我已经查找了其他人发布的有关分段错误问题的解决方案,但它们似乎并没有解决我的问题 谁能解释一下什么地方出了问题,我该怎么解决CS50恢复分段故障,c,cs50,C,Cs50,这是从pset4 CS50恢复。编译时没有错误。当我运行代码时,我得到了分段错误。我不明白到底是什么错误。我已经查找了其他人发布的有关分段错误问题的解决方案,但它们似乎并没有解决我的问题 谁能解释一下什么地方出了问题,我该怎么解决 #include <stdio.h> #include <stdint.h> typedef uint8_t BYTE; int main(int argc, char *argv[]) { if (argc != 2) { pri
#include <stdio.h>
#include <stdint.h>
typedef uint8_t BYTE;
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Usage: ./recover image\n");
return 1;
}
FILE *inFile = fopen(argv[1], "r");
if(!inFile)
{
printf("Could not open file!\n");
return 1;
}
BYTE buffer[512];
FILE *outFile = NULL;
int imageNum = 0;
char fileName[8];
while (!feof(inFile))
{
fread(buffer, 1, sizeof(buffer), inFile);
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[4] & 0xf0) == 0xef0)
{
if (imageNum > 0)
{
fclose(outFile);
}
imageNum++;
sprintf(fileName, "%03i.jpg", imageNum);
outFile = fopen(fileName, "w");
}
if (outFile != NULL)
{
fwrite(buffer, 1, sizeof(buffer), outFile);
}
}
fclose(outFile);
fclose(inFile);
return 0;
}
#包括
#包括
typedef uint8_t字节;
int main(int argc,char*argv[])
{
如果(argc!=2)
{
printf(“用法:./recover image\n”);
返回1;
}
文件*infle=fopen(argv[1],“r”);
如果(!infle)
{
printf(“无法打开文件!\n”);
返回1;
}
字节缓冲区[512];
FILE*outFile=NULL;
int imageNum=0;
字符文件名[8];
而(!feof(infle))
{
fread(缓冲区,1,缓冲区大小,填充);
如果(缓冲区[0]==0xff&&buffer[1]==0xd8&&buffer[2]==0xff&&buffer[4]&0xf0)==0xef0)
{
如果(imageNum>0)
{
fclose(输出文件);
}
imageNum++;
sprintf(文件名为“%03i.jpg”,imageNum);
outFile=fopen(文件名,“w”);
}
如果(输出文件!=NULL)
{
fwrite(缓冲区,1,sizeof(缓冲区),输出文件);
}
}
fclose(输出文件);
fclose(infle);
返回0;
}
文件名
定义为在字符文件名[8]中有八个元素代码>,但sprintf(文件名,“%03i.jpg”,imageNum)当imageNum
超过999时,code>写入超过八个字符。SEGFULT的原因可能是以下声明:
char fileName[8];
对于大于999的文件名,fileName
将溢出
i、 e.对于imagenum>=1000
sprintf(fileName, "%03i.jpg", imageNum);//produces 8 characters + NULL == 9
…将产生“1000.jpg”
,这是一种缓冲区溢出,因此是SEGFULT
使fileName
更大是一个解决方案:
char filename[20];//or larger as needed.
也,
根据和的定义,以下函数参数放错了位置:
fread(buffer, 1, sizeof(buffer), inFile);
fwrite(buffer, 1, sizeof(buffer), outFile);
^ ^
应该是:
fread(buffer, sizeof(buffer), 1, inFile);
fwrite(buffer, sizeof(buffer), 1, outFile);
^ ^
通过更改这些代码行,我找到了上述问题的解决方案
while (!feof(inFile))
到
及
到
另外,主要的问题是我的if状况,我从
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[4] & 0xf0) == 0xef0)
到
最后一个变化是什么
imageNum++;
sprintf(fileName, "%03i.jpg", imageNum);
outFile = fopen(fileName, "w");
到
谢谢大家的建议和帮助。fwrite(buffer,1,sizeof(buffer),outFile)代码>。。。你的意思是:fwrite(buffer,sizeof(buffer),1,outFile)代码>?阅读并理解:谢谢你的帮助。我的while循环条件部分是问题所在。现在已经解决了,我根据你提到的更改了我的文件名的大小以及fread()和frwite()函数,但是我仍然得到了分段fault@ZaraK-关于故障发生的确切位置的更多信息会有所帮助。您是否已从代码中删除而(!feof(infle))
。(请参阅文章下方的注释。)您是否在调试程序中运行?谢谢你的帮助。我运行了debug 50,发现问题出在我的if条件上。很好,你终于能够找到解决方案了!您可以让其他人知道此问题已解决的方法是将其中一个答案标记为已接受答案(空心复选标记)。您的答案是最完整的答案,因此标记此答案将是适当的:)
fread(buffer, sizeof(buffer), 1, inFile);
fwrite(buffer, sizeof(buffer), 1, outFile);
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[4] & 0xf0) == 0xef0)
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
imageNum++;
sprintf(fileName, "%03i.jpg", imageNum);
outFile = fopen(fileName, "w");
sprintf(fileName, "%03i.jpg", imageNum);
outFile = fopen(fileName, "w");
imageNum++;