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

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]指向的堆空间。

代码逻辑问题

  1. 没有校验malloc返回值,不符合题目要求的内存分配失败校验规则
  2. 重复调用fgets,单次循环读两次行,漏读内容
  3. 读取的内容没有做反转处理,也没有逐行输出
  4. 读取后没有关闭文件指针,存在资源泄漏
  5. 没有处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:45:07