c 中的 scandir - sel 函数实现
scandir in c - sel function implementation
man scandir
给出了 scandir
函数的以下结构:
int scandir(const char *dirp, struct dirent ***namelist,
int (*filter)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));
假设我定义如下:
struct dirent **namelist;
int len = scandir('.', &namelist, NULL, NULL)
这会列出当前文件夹中的所有文件和文件夹名称。但是假设我有一个具有以下结构的 filter
和 compar
函数:
int (*filter)(const struct dirent *) {
}
和 compar 类似,我想根据某些条件调用此过滤函数或只是 NULL
:
if (some criteria) int *filters = NULL;
else int* filters = &filter
int len = scandir('.', &namelist, filters, NULL)
但这会导致指针错误。有办法解决这个问题吗?
filter
是函数指针,不是int指针。
- 在您的代码中,
filter
的局部作用域为 if else 块,这是错误的。
工作代码如下所示:
int nodots(const struct dirent *dp)
{
return (dp->d_name[0] != '.');
}
int main(int argc, char **argv)
{
struct dirent **entries;
...
int (*myfilter)(const struct dirent *) = NULL;
if(some_condition) myfilter = nodots;
...
nents = scandir(".", &entries, myfilter, alphasort);
}
man scandir
给出了 scandir
函数的以下结构:
int scandir(const char *dirp, struct dirent ***namelist,
int (*filter)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));
假设我定义如下:
struct dirent **namelist;
int len = scandir('.', &namelist, NULL, NULL)
这会列出当前文件夹中的所有文件和文件夹名称。但是假设我有一个具有以下结构的 filter
和 compar
函数:
int (*filter)(const struct dirent *) {
}
和 compar 类似,我想根据某些条件调用此过滤函数或只是 NULL
:
if (some criteria) int *filters = NULL;
else int* filters = &filter
int len = scandir('.', &namelist, filters, NULL)
但这会导致指针错误。有办法解决这个问题吗?
filter
是函数指针,不是int指针。- 在您的代码中,
filter
的局部作用域为 if else 块,这是错误的。
工作代码如下所示:
int nodots(const struct dirent *dp)
{
return (dp->d_name[0] != '.');
}
int main(int argc, char **argv)
{
struct dirent **entries;
...
int (*myfilter)(const struct dirent *) = NULL;
if(some_condition) myfilter = nodots;
...
nents = scandir(".", &entries, myfilter, alphasort);
}