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

使用getline传递参数至dirr函数无输出问题求助

Getline读取参数导致Dirr函数无法输出目录内容的问题解决

问题核心

getline函数会将用户输入末尾的换行符\n一并读取到目标字符串中,而你之前用的scanf("%199[^\n]", args)会在换行符前停止读取,不会将换行符存入参数。这就导致传递给opendir的目录名末尾多了一个无效的换行符,系统无法识别该目录,因此dirr函数无法输出文件列表。

解决方案

在调用dirr前,去除字符串末尾的换行符,并完善输入错误处理:

  1. 修正getline相关的类型与初始化:

    • getline返回值为ssize_t(有符号类型),而非size_t,避免读取失败时的错误判断
    • 无需提前手动malloc内存,将args初始化为NULL、bufsize设为0,getline会自动分配足够的内存
  2. 去除换行符:

    • 检查读取到的字符数大于0,且最后一个字符是\n时,将其替换为字符串结束符\0
  3. 添加错误处理:

    • 判断getline是否读取失败
    • 在opendir失败时,用perror打印具体错误信息,方便排查问题
  4. 释放内存:

    • 手动释放getline分配的内存,避免内存泄漏

修改后的完整代码

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

void dirr(char *arguments);
void cd(char *arguments);
void envir(char *envp[]);

int main(int argc, char* argv[], char *envp[]){

    char *args = NULL;
    size_t bufsize = 0;
    ssize_t chars;

    printf("enter arguments: ");
    chars = getline(&args, &bufsize, stdin);
    
    // 处理输入失败的情况
    if (chars == -1) {
        fprintf(stderr, "读取输入失败\n");
        free(args);
        return EXIT_FAILURE;
    }

    // 移除末尾的换行符
    if (chars > 0 && args[chars - 1] == '\n') {
        args[chars - 1] = '\0';
    }

    printf("%zd characters were read.\n", chars);
    printf("You typed: '%s' \n", args);

    dirr(args);
  
    free(args); // 释放getline分配的内存
    return EXIT_SUCCESS;
}

void dirr(char *arguments){
    printf("Files in: %s\n", arguments);
    
    DIR *d;
    struct dirent *dir;

    d = opendir(arguments);
    
    if (d) {
        while ((dir = readdir(d)) != NULL) {
            printf("%s\n", dir->d_name);
        }
        closedir(d);
    } else {
        // 打印具体错误原因,比如目录不存在、权限不足等
        perror("无法打开目录");
    }
}

额外说明

  • 原代码中envir函数的声明参数类型有误,修正为void envir(char *envp[])以匹配main函数传递的环境变量数组类型
  • perror会根据当前的错误码(errno)输出对应的错误描述,能帮助你快速定位问题,比如输入的目录不存在时会提示无法打开目录: No such file or directory

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:05:22