You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 reverse.c音频反转功能未通过官方检查求助

CS50 reverse.c 反转音频无法通过升音阶反转测试

我编写的reverse.c程序生成的反转音频听起来正常,但在CS50的最终检查中,“reverse.c reverses ascending scale”项未通过,提示:

:( reverse.c reverses ascending scale
file is not reversed as specified

我尝试调整fseek参数但问题依旧,以下是我的代码:

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "wav.h"

int check_format(WAVHEADER header);
int get_block_size(WAVHEADER header);

int main(int argc, char *argv[])
{
    // Ensure proper usage
    // TODO #1

    if (argc != 3)
    {
        printf("enter wav files");
        return 1;
    }
    else if(strstr(argv[1], ".wav") != NULL && strstr(argv[2], ".wav") != NULL)
    {
        ;
    }
    else
    {
        return 1;
    }

    // Open input file for reading
    // TODO #2

    FILE *input = fopen(argv[1], "r");

    if(input == NULL)
    {
        printf("no file was opened");
        return 1;
    }

    // Read header
    // TODO #3

    WAVHEADER header;
    fread(&header, sizeof(WAVHEADER), 1, input);

    // Use check_format to ensure WAV format
    // TODO #4

    if(check_format(header) == 0)
    {
        return 1;
    }

    // Open output file for writing
    // TODO #5

    FILE *output = fopen(argv[2], "w");

    // Write header to file
    // TODO #6

    fwrite(&header, sizeof(WAVHEADER),1, output);

    // Use get_block_size to calculate size of block
    // TODO #7

    int size = get_block_size(header);

    int audio_size = header.subchunk2Size / size;

    // Write reversed audio to file
    // TODO #8

    BYTE *buffer = malloc(size);

    fseek(input, size, SEEK_END);

    while(ftell(input) - size >= sizeof(header))
    {
        if(fseek(input, -2 * size, SEEK_CUR))
        {
            return 1;
        }
        fread(buffer, size, 1, input);
        fwrite(buffer, size, 1, output);
    }
}

int check_format(WAVHEADER header)
{
    // TODO #4

    BYTE format[] = {'W','A','V','E'};

    for(int i = 0; i < 4; i++)
    {
        if(header.format[i] != format[i])
        {
            return 0;
        }
    }

    return 1;
}

int get_block_size(WAVHEADER header)
{
    int bytes = 0;

    bytes += (header.bitsPerSample / 8) * header.numChannels;

    return (bytes);
}

问题原因与修复方案

你的代码在音频块反转的fseek逻辑上存在错误,导致首尾的音频块没有被正确处理,所以无法通过升音阶测试。具体修复如下:

  1. 修正文件打开模式:
    必须用二进制模式打开WAV文件,避免Windows系统下的格式转换问题:

    FILE *input = fopen(argv[1], "rb");
    FILE *output = fopen(argv[2], "wb");
    
  2. 重构音频反转的指针逻辑:
    原代码的初始定位和循环条件会漏掉第一个音频块,修改后的反转逻辑如下:

    // Write reversed audio to file
     BYTE *buffer = malloc(size);
     if (buffer == NULL) {
         fclose(input);
         fclose(output);
         return 1;
     }
    
     // 定位到最后一个音频块的起始位置
     fseek(input, -size, SEEK_END);
    
     // 循环读取直到音频数据起始位置(header之后)
     while (ftell(input) >= sizeof(WAVHEADER)) {
         fread(buffer, size, 1, input);
         fwrite(buffer, size, 1, output);
         // 仅当未到达header位置时,往前跳两个块
         if (ftell(input) > sizeof(WAVHEADER)) {
             fseek(input, -2 * size, SEEK_CUR);
         }
     }
    
     free(buffer);
     fclose(input);
     fclose(output);
    
  3. 补充资源释放:
    原代码未关闭文件、未检查malloc结果,修复后需添加这些步骤避免资源泄漏和崩溃。

内容的提问来源于stack exchange,提问作者James Gui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:15:03