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
相关产品推荐
相关产品推荐

