Memchr dir entry C - PullRequest
       7

Memchr dir entry C

1 голос
/ 19 октября 2011

Кто-нибудь может мне здесь помочь?Я пытаюсь проверить каждую запись в каталоге, если в ее имени есть буква.Очевидно, это не работает.Мой главный вопрос: правильно ли я использую memchr при использовании списка имен [n] -> d_name в качестве памяти?

#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

  int main(void)
  {
       struct dirent **namelist;
       int n;

       n = scandir(".", &namelist, 0, alphasort);
       if (n < 0)
           perror("scandir");
       else 
       {
    char * search;
          while (n--) {
        search= (char*) memchr(namelist[n]->d_name,'a',(sizeof(namelist[n]->d_name)));
        if(search !=NULL){
                printf("%s\n", namelist[n]->d_name);
                        free(namelist[n]);
            }
    char * search;
    }
          free(namelist);
       }
   }

Ответы [ 2 ]

1 голос
/ 19 октября 2011

Этот код на самом деле работает для меня (под Win7 / CygWin):

pax$ ./qq
xyzzyaf
xyzzyae
xyzzyad
xyzzyac
xyzzyab
xyzzyaa
.bashrc
.bash_profile
.bash_history

pax$ ls -ad *a* .*a*
.bash_history  .bash_profile  .bashrc  xyzzyaa
xyzzyab        xyzzyac        xyzzyad  xyzzyae
xyzzyaf

Но почему вы используете memchr?Поле d_name является строкой в ​​стиле C, о чем свидетельствует тот факт, что вы можете выполнить printf("%s\n",...) для него.

Для этого следует использовать strchr.Использование memchr может выполнять поиск за концом строки, возможно, давая ложные результаты, если он обнаружит a в любом мусоре после этого.


Если это не поможетвы, то вам нужно определить фразу «очевидно, что это не работает».Другими словами, что это за файлы в каталоге и что вы получаете?Это очень поможет в решении этой проблемы.

0 голосов
/ 19 октября 2011

sizeof и strlen не делают то же самое.

Но, как упоминает @paxdiablo, вы должны просто использовать strchr

...