IT序号网

CS50 恢复段错误问题

mayingbao 2024年08月15日 编程语言 10 0

该程序的目标是从文件中恢复 JPG。

我已经在 CS50 在线类(class)中研究这个问题大约四五天了,我就是想不通。我继续遇到段错误,我不知道为什么。

我试过 debug50 并发现当程序尝试写入新文件时出现错误。为什么这样做我无法弄清楚。

在这个问题上我一直在用头撞墙,我已经完全删除并重写了多次。任何帮助将不胜感激。

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
 
int main(int argc, char *argv[]) 
{ 
    if (argc != 2) 
    { 
        fprintf(stderr, "Usage ./recover file.type\n"); 
        return 1; 
    } 
 
    char *infile = argv[1]; 
    FILE *inptr = fopen(infile, "rb"); 
 
 
    if (inptr == NULL) 
    { 
        fprintf(stderr, "Could not open file designated to be recovered\n"); 
        fclose(inptr); 
        return 2; 
    } 
 
    int counter = 0; 
    FILE *img; 
 
    uint8_t buffer[512]; 
 
    while (fread(buffer, sizeof(*buffer), 512, inptr)) 
    { 
        if (buffer[0] == 0xff && 
            buffer[1] == 0xd8 && 
            buffer[2] == 0xff && 
            (buffer[3] & 0xf0) == 0xe0) 
        { 
            if (counter > 0) 
            { 
                fclose(img); 
            } 
 
            char filename[8]; 
            sprintf(filename, "%03i.jpg", counter); 
 
            img = fopen(filename, "w"); 
 
            counter++; 
        } 
 
        if (counter !=0) 
        { 
            fwrite(buffer, sizeof(*buffer), 512, img); 
        } 
    } 
    fclose(img); 
    fclose(inptr); 
    return 0; 
} 

请您参考如下方法:

char filename[7]; 
sprintf(filename, "%03i.jpg", counter); 

由于 NUL 终止符 \0,七个字符的字符串占用 8 个字符。使数组更大,这样您就不会写到它的末尾。

if(img == NULL) 
{ 
    fprintf(stderr, "Could not create image file\n"); 
    fclose(img); 
    return 3; 
} 

如果 img 没有打开,您不需要关闭它。另一方面,如果它确实打开了,那么您确实需要关闭它。将 fclose() 调用移动到循环的末尾。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!