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

C语言使用命令行参数合并数据文件的代码错误排查

C代码错误排查与修正

以下是这段合并文件代码中的错误及对应修正方案:

  • fprintf参数传递错误:
    在mergeFiles函数中,fprintf的%d格式符需要接收int类型的值,但代码中传递的是num的地址(&num),这会导致输出内存地址而非读取到的数值。
    修正:将两处fprintf中的&num改为num,同时统一换行格式保证输出内容一致:

    fprintf(file3,"%d\n", num);
    
  • 函数调用语法错误:
    main函数中调用合并函数时,错误地将函数名mergeFiles拆成了merge files,会导致编译报错。
    修正:改为正确的函数名调用:

    mergeFiles(file1, file2, file3);
    
  • fprintf参数缺失:
    错误处理代码中,fprintf("Error Opening files\n");缺少目标文件指针参数,标准错误输出应使用stderr。
    修正:改为:

    fprintf(stderr, "Error Opening files\n");
    
  • 用法提示格式不规范:
    原提示中的参数与程序名无空格分隔,且第三个参数描述错误(应为输出文件),用户难以理解正确命令格式。
    修正:调整提示文本:

    printf("Usage : %s <data1> <data2> <output-file>\n", argv[0]);
    

修正后的完整代码

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

void mergeFiles(FILE *file1, FILE *file2, FILE *file3)
{
    int num;
    while(fscanf(file1,"%d", &num) != EOF)
    {
        fprintf(file3,"%d\n", num);
    }
    while(fscanf(file2,"%d", &num) != EOF)
    {
        fprintf(file3,"%d\n", num);
    }
}

int main(int argc, char *argv[]){
    if(argc != 4) {
        printf("Usage : %s <data1> <data2> <output-file>\n", argv[0]);
        return 1;
    }

    FILE *file1 = fopen(argv[1], "r");
    FILE *file2 = fopen(argv[2], "r");
    FILE *file3 = fopen(argv[3], "w");

    if(file1 == NULL || file2 == NULL || file3 == NULL){
        fprintf(stderr, "Error Opening files\n");
        // 打开失败时关闭已成功打开的文件,避免资源泄漏
        if(file1) fclose(file1);
        if(file2) fclose(file2);
        if(file3) fclose(file3);
        return 1;
    }

    mergeFiles(file1, file2, file3);
    printf("Merged content written to %s\n", argv[3]);

    fclose(file1);
    fclose(file2);
    fclose(file3);
    return 0;
}

额外优化:在文件打开失败时,关闭已经成功打开的文件,避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:02:42