2011-10-19 5 views
1

ここで私を助けてくれますか?その名前に文字が存在する場合は、各ディレクトリエントリをチェックしています。明らかにそれは動作していません。私の主な質問は、メモリとしてネームリスト[n] - > d_nameを正しく使用していることです。dirのエントリのmemchr C

#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); 
     } 
    } 

答えて

1

このコードは実際には(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

を使用する必要があります。しかし、働いてくれてありがとう:) – user975044

+0

mm strchrの前に私は現在のディレクトリのすべてのファイルとディレクトリを取得していました.. strchrでmemchrを切り替えた後、正常に動作しました。私はそれが何か違いがあれば(おそらく)ubuntuにいる – user975044

0

sizeofstrlenは同じことをしません。

しかし、@paxdiabloは言及して、私はそのわずか混乱を招くことに..私は私のクラスにCとC++の両方をやってきた笑でもよくわからないので、あなただけの、正直strchr