用C实现ls命令时解析参数出现段错误问题求助
解决ls命令实现中的参数解析段错误问题
原代码中的核心问题
- 参数传递与类型不匹配:
comparator函数接收char* av,但调用时传入的是av[0](程序名),且函数内av[i]取的是字符串的单个字符(char类型),而strcmp需要两个char*类型参数,类型不匹配直接触发段错误。 - 命令行参数未处理:
main函数仅处理ac==1的情况,传入-a参数(ac>1)时完全无逻辑处理,导致参数被忽略。 - 循环条件错误:
my_ls_a中的while (direc != NULL || comp == 0)逻辑错误,当direc为NULL时仍会进入循环,访问direc->d_name触发空指针访问。 - 目录指针未检查:
opendir(".")后未判断返回值是否为NULL,若目录打开失败直接调用readdir会导致段错误。 - 冗余错误代码:
path = readdir(pdirec)毫无意义,还会覆盖函数参数,后续判断逻辑也不符合需求。
修正后的代码实现
#include <dirent.h> #include <string.h> #include <stdio.h> // 判断是否需要显示隐藏文件 int should_show_hidden(int ac, char **av) { for (int i = 1; i < ac; i++) { if (strcmp(av[i], "-a") == 0 || strcmp(av[i], "-la") == 0 || strcmp(av[i], "-al") == 0) { return 1; } } return 0; } int my_ls(int ac, char **av) { int show_hidden = should_show_hidden(ac, av); DIR *pdirec = opendir("."); if (pdirec == NULL) { perror("opendir failed"); return 84; } struct dirent *direc; while ((direc = readdir(pdirec)) != NULL) { // 不显示隐藏文件时,跳过以.开头的文件 if (!show_hidden && direc->d_name[0] == '.') { continue; } printf("%s ", direc->d_name); } printf("\n"); closedir(pdirec); return 0; } int main(int ac, char *av[]) { return my_ls(ac, av); }
关键修正说明
- 参数解析逻辑:新增
should_show_hidden函数遍历所有命令行参数,正确识别-a、-la、-al等需要显示隐藏文件的参数。 - 循环逻辑修正:改为
while ((direc = readdir(pdirec)) != NULL),确保仅在direc有效时访问其成员,同时根据show_hidden值决定是否跳过隐藏文件。 - 错误检查:添加
opendir返回值检查,避免空指针操作;若使用自定义my_printf,替换掉标准printf即可。 - main函数简化:直接将命令行参数传递给
my_ls,统一处理所有参数情况。
内容的提问来源于stack exchange,提问作者Molaryy
相关产品推荐
相关产品推荐

