记录目录C的Memchr

时间:2011-10-19 01:07:20

标签: c char

有人可以帮助我吗?我正在尝试检查每个目录条目,如果其名称中存在一个字母。显然它不起作用。我的主要问题是我在使用名单[n] - > d_name作为内存时是否正确使用了memchr?

#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 个答案:

答案 0 :(得分: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

但你为什么要使用memchrd_name字段是C风格的字符串,可以在其上执行printf("%s\n",...)这一事实证明。

您应该使用strchr。使用memchr 可能搜索字符串的结尾,如果在其后的任何垃圾中找到a,可能会给出错误的结果。


如果这对您没有帮助,那么您需要定义短语“显然它不起作用”。换句话说,目录中的所有文件是什么以及您获得了什么输出?这将大大有助于解决这个问题。

答案 1 :(得分:0)

sizeofstrlen不做同样的事情。

但是,正如@paxdiablo所提到的,你应该只使用strchr