问题描述
此代码正在获取给定目录中存在的子目录名称。我想要做的是使用分隔符 " "
拆分子目录名称,但是当我打印 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