CS50 pset4恢复,出现分段错误

时间:2020-04-19 16:50:30

标签: c segmentation-fault cs50

此代码出现细分错误。有人可以帮忙吗?我尝试了几种方法,但仍然无法解决问题。我尝试将FILE *img = NULL替换为FILE *img,但出现另一个错误,提示variable 'img' is uninitialized when used in fwrite(buffer, 512, 1, img)

#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    //Open memory card
    if (argc != 2)
    {
        printf("Usage: ./recover image\n");
        return 1;
    }

    FILE *file = fopen(argv[1], "r");
    if (!file)
    {
        return 1;
    }

    //Read 512 bytes into a buffer
    int counter = 0;
    unsigned char buffer[512];
    char filename[8];
    FILE *img = NULL;

    while (fread(buffer, 512, 1, file) == 1)
    {
        if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] && 0xf0 == 0xe0))
        {
            //If first JPEG
            if (counter == 0)
            {
                //open a new file
                sprintf(filename, "%03i.jpg", counter);
                img = fopen(filename, "w");

                //write the array into the new file
                fwrite(buffer, 512, 1, img);
                counter++;
            }

            //if not first JPEG
            else
            {
                //close the file
                fclose(img);

                //open a new file
                sprintf(filename, "%03i.jpg", counter);
                img = fopen(filename, "w");

                //write the array into the new file
                fwrite(buffer, 512, 1, img);
                counter++;
            }
        }
        //Else, if already found new JPEG
        else
        {
            fwrite(buffer, 512, 1, img);
        }
    }

    //Close any remaining files
    fclose(img);
    fclose(file);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果此if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] && 0xf0 == 0xe0)) 不是为真(与第一次阅读一样),程序会做什么?

此注释//Else, if already found new JPEG需要放入代码中;也就是说,以下write必须是有条件的。