我在C中实现ls -R
linux命令,我在递归步骤时遇到问题。
到目前为止我已经
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
void lsr(char *directory){
DIR *dir;
dir = opendir(directory);
int size = 0;
struct dirent *d;
char *que[100];
char buf[100];
while((d = readdir(dir)) != NULL){
struct stat statbuff;
if(strcmp(d->d_name,".")== 0 || strcmp(d->d_name,"..")==0){
continue;
}
sprintf(buf, "%s/%s", directory, d->d_name);
stat(buf,&statbuff);
printf(" %s",d->d_name);
printf("\n");
if(S_ISDIR(statbuff.st_mode)){
printf("%s Is a directory\n",buf);
que[size] = buf;
size++;
}
}
int i;
for(i = 0; i < size; i++){
printf("dir: %s\n",que[i]);
}
printf("Are in the queue\n");
//for(i = 0; i < size; i++){
// lsr(que[i]);
//}
closedir(dir);
}
int main(int argc, char *argv[]){
char directory[200];
if(argc ==1){
strcpy(directory,".");
}
else{
strcpy(directory,argv[1]);
}
lsr(directory);
return 0;
}
我要做的是该函数在它递归到它找到的第一个目录之前完成打印目录中的所有文件。我唯一能想到的是将它们存储到一个数组中,然后以这种方式进行调用。 如果有人能指出为什么当我循环遍历数组时,它的内容是错误的,甚至可能更好,一个更实用的解决方案,如何在文件名称打印后递归到目录我会非常感激! / p>
答案 0 :(得分:0)
此处将buf
指向的地址存储在que [size]中。
que[size] = buf;
在下一个循环迭代中,stat(buf,&statbuff);
修改buf和que[size]
指向的内容
因此,您阵列的每个插槽都指向同一个地址,每次修改此内容时,您都会修改整个数组。
我建议您使用strcpy()
或在stat()
来电之前重新分配buf。