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

C语言打印命令行参数指定文件内容时运行异常问题排查

代码问题分析与修正方案

存在的问题

  • 循环索引错误:argv数组的第0位存储的是当前程序的执行文件名,你运行./a.exe test.txt时argv[0]值为./a.exe,代码首先打开的是可执行文件本身,输出的MZÉ$就是Windows系统PE格式可执行文件的头部标识,和你遇到的错误输出完全匹配。
  • 提前终止程序:处理完第一个文件后直接调用exit(EXIT_SUCCESS),哪怕索引修正后也无法处理多个传入的文件参数。
  • 异常分支无处理:当传入参数少于2个时没有任何提示,用户无法感知报错原因。
  • 冗余变量:定义的alllines、size变量全程未使用,属于无效代码。
  • 类型不兼容:getline函数的第二个参数要求是size_t*类型,使用unsigned int传递在部分架构下会出现类型适配问题。
  • 无文件打开错误提示:fopen失败直接退出,无法定位是权限问题还是文件不存在等具体报错原因。

修正后的代码

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

int main(int argc, char** argv){
    if(argc < 2){
        printf("用法:%s 文件名1 [文件名2...]\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    // 从i=1开始遍历,跳过argv[0]的程序自身名称
    for(int i = 1; i < argc; i++){
        FILE* fp;
        size_t bufferSize = 1024;
        char* line = malloc(sizeof(char)*bufferSize);                
        char* filename = argv[i];
        fp = fopen(filename, "r");
        if (fp == NULL) {
            perror(filename);
            free(line);
            continue;
        }

        while (getline(&line, &bufferSize, fp) != -1){          
            printf("%s", line);
        }
        fclose(fp);
        if (line)
            free(line);
    }  
    return EXIT_SUCCESS;
}

验证方式

使用原有编译命令gcc program.c编译后,执行./a.exe test.txt即可正常输出文件内容,同时支持传入多个文件路径批量打印内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:06:03