2013-07-03 2 views
2

im ищет код, который будет рекурсивно перечислять все каталоги и файлы каталога, заданного по аргументу в программировании на языке C, ive найти код для поиска (ниже), но я не понимаю функцию snprintf и, в частности,/", Я бы предпочел использовать strcat или другую системную функцию для переопределения функции sprintf, но я не вижу, как я не понимаю, что здесь делает snprintf. Heres код:Рекурсивно перечислить каталоги в C

int is_directory_we_want_to_list(const char *parent, char *name) { 
    struct stat st_buf; 
    if (!strcmp(".", name) || !strcmp("..", name)) 
     return 0; 

    char *path = alloca(strlen(name) + strlen(parent) + 2); 
    sprintf(path, "%s/%s", parent, name); 
    stat(path, &st_buf); 
    return S_ISDIR(st_buf.st_mode); 
} 

int list(const char *name) { 
    DIR *dir = opendir(name); 
    struct dirent *ent; 

    while (ent = readdir(dir)) { 
     char *entry_name = ent->d_name; 
     printf("%s\n", entry_name); 

     if (is_directory_we_want_to_list(name, entry_name)) { 
      // You can consider using alloca instead. 
      char *next = malloc(strlen(name) + strlen(entry_name) + 2); 
      sprintf(next, "%s/%s", name, entry_name); 
      list(next); 
      free(next); 
     } 
    } 

    closedir(dir); 
} 

из How to recursively list directories in C on LINUX

Хорошо, моя программа работает, но теперь я хочу, чтобы сохранить все файлы и директории, выводимой в файл, как я запустить свою программу ./a.out. > Буфер, где буфер содержит то, что программа должна напечатать на оболочке

+2

Ух ... какой вызов snprintf? В фрагменте кода нет. Если вы не понимаете, что он делает, почему бы вам не взглянуть на то, что он делает? http://www.cplusplus.com/reference/cstdio/snprintf/ –

+2

в чем проблема с sprintf точно? он просто конкатенирует 3 строки - имя, "/" и имя_пользователя. –

+0

Я думаю, что sprintf создает всю проблему –

ответ

0

линии

sprintf(next, "%s/%s", name, entry_name); 

может быть заменен

strcpy (next, name); 
strcat (next, "/"); 
strcat (next, entry_name); 

и он будет делать то же самое. Означает ли это это для вас?

+0

, что было быстро, да, мне стало намного лучше, спасибо, да, это было sprintf, извините – Saxtheowl

+1

Обратите внимание, что каждый вызов 'strcat()' включает в себя хождение по всей строке, чтобы найти в конце этого, поэтому один вызов 'sprintf()' здесь намного эффективнее. –

Смежные вопросы