C语言读取命令行参数指定文件并存入数组问题求助
编译警告原因
- 第一个警告
passing argument 1 of 'fgets' from incompatible pointer type:你定义的input是字符指针数组char* input[LENGTH],每个元素是char*类型,而fgets第一个参数需要传入char*类型的缓冲区地址,你直接传数组名input相当于传char**类型,类型不匹配。同时你循环里调用了两次fgets,会导致隔行读取,大部分内容直接被丢弃,所以没有输出。 - 第二个警告
attempt to free a non-heap object 'input':input是栈上分配的数组,不是malloc出来的堆内存,直接free(input)属于非法操作,只能free你动态分配的input[i]指向的堆空间。
代码逻辑问题
- 没有校验
malloc返回值,不符合题目要求的内存分配失败校验规则 - 重复调用
fgets,单次循环读两次行,漏读内容 - 读取的内容没有做反转处理,也没有逐行输出
- 读取后没有关闭文件指针,存在资源泄漏
- 没有处理
fgets读取到的换行符,反转后会出现换行符在最开头的问题
修复后可运行代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #define LENGTH 1024 #define MAX_LINES 1024 // 最大支持读取的行数,可根据需求调整 // 字符串反转函数 void reverse_str(char *str) { if (str == NULL || *str == '\0') return; int len = strlen(str); // 去掉fgets读取到的末尾换行符 if (str[len - 1] == '\n') { str[len - 1] = '\0'; len--; } for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - 1 - i]; str[len - 1 - i] = temp; } } int main(int argc, char *argv[]) { // 存储每行内容的指针数组 char *lines[MAX_LINES] = {NULL}; int line_count = 0; if (argc != 2) { printf("请传入文件路径参数。\n"); return 1; } FILE *fp = fopen(argv[1], "r"); if (fp == NULL) { printf("文件打开失败!\n"); return 1; } char buf[LENGTH]; // 临时缓冲区存储读取的单行内容 while (fgets(buf, sizeof(buf), fp) != NULL && line_count < MAX_LINES) { // 分配内存,+1是为了存储字符串结束符'\0' lines[line_count] = (char*)malloc(strlen(buf) + 1); // 校验内存分配是否成功 if (lines[line_count] == NULL) { printf("内存分配失败!\n"); // 释放已经分配的内存避免泄漏 for (int i = 0; i < line_count; i++) { free(lines[i]); } fclose(fp); return 1; } // 复制缓冲区内容到动态分配的内存 strcpy(lines[line_count], buf); line_count++; } fclose(fp); // 逐行反转并输出 for (int i = 0; i < line_count; i++) { reverse_str(lines[i]); printf("%s\n", lines[i]); free(lines[i]); // 输出后释放内存 } return 0; }
内容的提问来源于stack exchange,提问作者BeanieBarrow
相关产品推荐
相关产品推荐

