如何拆分子目录名称?

问题描述

代码正在获取给定目录中存在的子目录名称。我想要做的是使用分隔符 " " 拆分子目录名称,但是当我打印 token 时,它应该只打印第一个子目录,而是代码打印所有子目录名称。我不知道 strtok 不工作有什么问题。

给定的结果就像

/home/bilal/Videos/folder1/rasta
/home/bilal/Videos/folder1/fd
/home/bilal/Videos/folder1/fd/fds
/home/bilal/Videos/folder1/fd/sub

预期结果

/home/bilal/Videos/folder1/rasta
char path[PATH_MAX] = "";
char path1[PATH_MAX];

void listdir(void) {
    DIR *dir;
    struct dirent *entry;
    
    if (!(dir = opendir(path))) {  
        perror("opendir-path not found");
        return;
    }

    while ((entry = readdir(dir))) {  
        char *name = entry->d_name;   
        if (entry->d_type == DT_DIR)    /* if "." or ".." skip */
            if (!strcmp(name,".") || !strcmp(name,".."))
                continue;

        snprintf(path1,100,"%s/%s ",path,name);
        char *token = strtok(path1," ");
        printf("%s\n",token);

        if (entry->d_type == DT_DIR) {
            char *p;
            strcat(path,"/");
            strcat(path,name);
            listdir();           /* recursive call */
           
            if ((p = strrchr(path,'/'))) {
                if (p != path)          
                    *p = 0;  
            }
        }
    }
    closedir(dir);
}

int main(int argc,char **argv) {
    if (argc > 1)
        strcpy(path,argv[1]);
    else
        strcpy(path,"/home/bilal/Videos/folder1");        
    listdir();
}

解决方法

贴出的代码有几个问题:

  • 不需要使用 2 个单独的路径数组,您可以使用 path 并记住其原始长度以在每次迭代后剥离尾部。

  • 您在 snprintf(path1,100,"%s/%s ",path,name); 中的路径名后附加一个空格,strtok() 会立即切断该空格上的路径名:如果路径名的一个组成部分包含一个空格作为 { {1}} 会停在那里。

  • 不清楚您的目标是什么:在函数枚举目录条目并在子目录上递归时打印每个条目。

这是修改后的版本:

strtok