2014-12-26 5 views
0

Я использую dirent.h, чтобы увидеть все файлы в var/log, и я хочу сохранить их в массиве, но когда я их сохраняю, он выглядит как цифры вместо строки. Почему это происходит?C - Получение чисел вместо строки

Код здесь:

char *word = ".gz" ; 
    char *word2 = "."; 
    char *word3 = ".."; 
    DIR   *directory; 
    struct dirent *dir; 

    directory = opendir("/var/log"); 
    if (directory) { 
    while ((dir = readdir(directory)) != NULL) 
    { 
     if((strstr(dir->d_name, word) == NULL) && (strstr(dir->d_name, word2) == NULL) && (strstr(dir->d_name, word3) == NULL)) { 
     printf("%s\n", dir->d_name); 
     i++; 
     } 
    } 
     printf("%d\n",i); 

    closedir(directory); 
    } 
    char *array_of_files[i]; 
    i=0; 
    directory = opendir("/var/log"); 
    if (directory) { 
    while ((dir = readdir(directory)) != NULL) 
    { 
     if((strstr(dir->d_name, word) == NULL) && (strstr(dir->d_name, word2) == NULL) && (strstr(dir->d_name, word3) == NULL)) { 
     array_of_files[i]=dir->d_name; 
     printf("%d array of file \n",array_of_files[i]); 
     i++; 
     } 
    } 
     printf("%d\n",i); 
    int j; 
    for (j=0;j<i;j++){ 

     printf("%d ", array_of_files[j]); 
    } 
    closedir(directory); 

Во-первых, я использую счетчик, который подсчитывает количество файлов в папке, а затем я снова открыть каталог и создать массив с этим счетчиком, и начать спасения имена файлов в папке, но отображаются только цифры.

Пример этого:

./program 

speech-dispatcher 
dbconfig-common 
apache2 
mdm 
fsck 
samba 
aptitude 
dmesg 
unattended-upgrades 
postgresql 
udev 
installer 
cups 
hp 
btmp 
ConsoleKit 
syslog 
wtmp 
mysql 
lastlog 
23 
8962131 8962163 8962283 8962315 8962675 8962755 8962947 8963091 8963155 8963331 8963403 8963539 8963579 8963691 8963755 8964251 8964307 8964435 8964507 8964539 8964571 8964627 8964723 

Я знаю, что есть лучший способ сделать массив вместо двух в то время как петли, но я не могу думать ни о чем лучше прямо сейчас; если вы можете порекомендовать что-то, это будет оценено по достоинству.

+0

Если вы читаете [ 'readdir'] (http://man7.org/linux/man-pages/man3/readdir.3 .html), вы увидите абзац «Данные, возвращаемые readdir(), могут быть перезаписаны последующими вызовами readdir() для одного и того же потока каталогов». Это означает, что вы не можете просто скопировать указатель на имя, вам нужно скопировать фактическую строку. –

ответ

2

Изменение ниже линии

printf("%d array of file \n",array_of_files[i]); to 
printf("%s array of file \n",array_of_files[i]);` 

И

printf("%d ", array_of_files[j]); to 
printf("%s ", array_of_files[j]); 
2

Используйте правильный формат, как ответил @SAN.

Копирование указателя не так много, поскольку dir->d_name может заселяться между вызовами.
Код должен создавать и управлять строковой копией.

char *array_of_files[i]; 
... 
    while (... 
    // array_of_files[i] =dir->d_name; 
    array_of_files[i] = strdup(dir->d_name); 
    ... 
    } 
} 

for (j=0;j<i;j++){ 
    // printf("%d ", array_of_files[j]); 
    printf("%s ", array_of_files[j]); 
    free(array_of_files[j]); 
} 

Если ваша система не имеет strdup(), простой в create your own

+0

Спасибо ... не заметил этого +1 .. – sas

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