这是从pset4 CS50恢复过来的。编译它时没有错误。当我运行代码时,会出现分段错误。我不明白究竟是什么错误。我已经找到了其他人发布的关于分割错误的问题的解决方案,但是他们似乎并没有解决我的问题。
有人能解释一下哪里出了问题吗我该怎么解决。
#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;
}发布于 2020-06-04 08:17:27
通过更改这些代码行,我找到了上述问题的解决方案。
while (!feof(inFile)) 至
while (fread(buffer, sizeof(buffer), 1, inFile))和
fread(buffer, 1, sizeof(buffer), inFile);
fwrite(buffer, 1, sizeof(buffer), outFile);至
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++;谢谢大家的建议和帮助。
发布于 2020-06-02 13:29:14
分段错误的原因很可能是这样的声明:
char fileName[8];对于大于999的文件名,fileName将溢出。
即用于imagenum >= 1000
sprintf(fileName, "%03i.jpg", imageNum);//produces 8 characters + NULL == 9...will产生缓冲区溢出的"1000.jpg",从而导致分段故障。
使fileName更大是解决办法:
char filename[20];//or larger as needed.也是
根据fwrite()和fread()的定义,以下函数参数被错误放置:
fread(buffer, 1, sizeof(buffer), inFile);
fwrite(buffer, 1, sizeof(buffer), outFile);
^ ^应:
fread(buffer, sizeof(buffer), 1, inFile);
fwrite(buffer, sizeof(buffer), 1, outFile);
^ ^发布于 2020-06-02 13:28:51
fileName被定义为在char fileName[8];中有8个元素,但是一旦imageNum超过999,sprintf(fileName, "%03i.jpg", imageNum);就会写入8个以上的字符。
https://stackoverflow.com/questions/62152774
复制相似问题