使用getline传递参数至dirr函数无输出问题求助
Getline读取参数导致Dirr函数无法输出目录内容的问题解决
问题核心
getline函数会将用户输入末尾的换行符\n一并读取到目标字符串中,而你之前用的scanf("%199[^\n]", args)会在换行符前停止读取,不会将换行符存入参数。这就导致传递给opendir的目录名末尾多了一个无效的换行符,系统无法识别该目录,因此dirr函数无法输出文件列表。
解决方案
在调用dirr前,去除字符串末尾的换行符,并完善输入错误处理:
修正getline相关的类型与初始化:
- getline返回值为
ssize_t(有符号类型),而非size_t,避免读取失败时的错误判断 - 无需提前手动malloc内存,将
args初始化为NULL、bufsize设为0,getline会自动分配足够的内存
- getline返回值为
去除换行符:
- 检查读取到的字符数大于0,且最后一个字符是
\n时,将其替换为字符串结束符\0
- 检查读取到的字符数大于0,且最后一个字符是
添加错误处理:
- 判断getline是否读取失败
- 在
opendir失败时,用perror打印具体错误信息,方便排查问题
释放内存:
- 手动释放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
相关产品推荐
相关产品推荐

