Scandir自带过滤功能
Scandir Own filter function
我必须编写 2 个函数,过滤器 - 名称 > 5 个字符,并且我必须按类型对它们进行排序。
Filtr 函数应该如下所示?
int (* filter) (const struct dirent* entry) {
if ( (strlen(entry>d_name) - 1 ) > 5 ) {
return entry;
}
}
如何排序,在 dirent 其 dirent->d_type,但如何排序?
您是否考虑过查看 man 3 scandir
页面?
(我发现 Linux man-pages project 手册页是 C 库和系统级编程的最新版本。)
如果我们有一个函数需要调用者指定一个辅助函数,我们的函数应该调用它来完成一些任务,我们将它声明为一个函数指针。换句话说,虽然 scandir()
函数的原型是
int scandir(const char *dirp, struct dirent ***namelist,
int (*filter)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));
过滤器和比较函数的原型实际上是
int myfilter(const struct dirent *);
int mycompar(const struct dirent **, const struct dirent **);
功能的愚蠢实现(不满足您的练习要求)例如
int myfilter(const struct dirent *entry)
{
/* man 3 scandir says "entries for which filter()
* returns nonzero are stored".
*
* Since file names in Linux are multibyte strings,
* we use mbstowcs() to find out the length
* of the filename in characters.
*
* Note: strlen() tells the filename length in bytes,
* not characters!
*/
const size_t len = mbstowcs(NULL, entry->d_name, 0);
/* Keep filenames that are 3 or 7 characters long. */
return (len == 3) || (len == 7);
}
int mycompar(const struct dirent **entry1, const struct dirent **entry2)
{
const size_t len1 = mbstowcs(NULL, (*entry1)->d_name, 0);
const size_t len2 = mbstowcs(NULL, (*entry2)->d_name, 0);
/* Compare by file name lengths (in characters),
* sorting shortest file names first. */
return (int)((ssize_t)len1 - (ssize_t)len2);
}
使用POSIX.1-2008写代码的时候记得加上
#define _POSIX_C_SOURCE 200809L
在任何 #include
之前。为了使您的代码在不同的环境中正常工作(例如,在任何 Linux 系统中,在文件名中计算 个字符 而不是 字节 我们的世界),还有 #include <locale.h>
,并添加
setlocale(LC_ALL, "");
在你的 main()
之前 read/scan 或 write/print 任何东西。 (虽然还有很多 可以 进一步本地化他们的程序,以上通常就足够了。处理文本文件应该使用宽字符串 (L"This is a ωide §tring liteℛal "
) 和wchar_t
和 wint_t
类型的字符串和字符,具有宽字符串 I/O 函数。它并不比在愚蠢的 [=44 中做更复杂或更难做对=]"The twenty-seven ASCII letters are sufficient for everyone, even if it makes your name into a dirty word in your native language" 方式.
如果你的老师没有提到这些,你应该问为什么。无法正确处理文件或文本 Nöminäl Änimäl needs more €, and cowbell
的程序在当今时代不应该被接受。在学习正确的方法之前,无需先学习错误的方法,因为正确的方法和错误的方法一样容易。
我必须编写 2 个函数,过滤器 - 名称 > 5 个字符,并且我必须按类型对它们进行排序。
Filtr 函数应该如下所示?
int (* filter) (const struct dirent* entry) {
if ( (strlen(entry>d_name) - 1 ) > 5 ) {
return entry;
}
}
如何排序,在 dirent 其 dirent->d_type,但如何排序?
您是否考虑过查看 man 3 scandir
页面?
(我发现 Linux man-pages project 手册页是 C 库和系统级编程的最新版本。)
如果我们有一个函数需要调用者指定一个辅助函数,我们的函数应该调用它来完成一些任务,我们将它声明为一个函数指针。换句话说,虽然 scandir()
函数的原型是
int scandir(const char *dirp, struct dirent ***namelist,
int (*filter)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));
过滤器和比较函数的原型实际上是
int myfilter(const struct dirent *);
int mycompar(const struct dirent **, const struct dirent **);
功能的愚蠢实现(不满足您的练习要求)例如
int myfilter(const struct dirent *entry)
{
/* man 3 scandir says "entries for which filter()
* returns nonzero are stored".
*
* Since file names in Linux are multibyte strings,
* we use mbstowcs() to find out the length
* of the filename in characters.
*
* Note: strlen() tells the filename length in bytes,
* not characters!
*/
const size_t len = mbstowcs(NULL, entry->d_name, 0);
/* Keep filenames that are 3 or 7 characters long. */
return (len == 3) || (len == 7);
}
int mycompar(const struct dirent **entry1, const struct dirent **entry2)
{
const size_t len1 = mbstowcs(NULL, (*entry1)->d_name, 0);
const size_t len2 = mbstowcs(NULL, (*entry2)->d_name, 0);
/* Compare by file name lengths (in characters),
* sorting shortest file names first. */
return (int)((ssize_t)len1 - (ssize_t)len2);
}
使用POSIX.1-2008写代码的时候记得加上
#define _POSIX_C_SOURCE 200809L
在任何 #include
之前。为了使您的代码在不同的环境中正常工作(例如,在任何 Linux 系统中,在文件名中计算 个字符 而不是 字节 我们的世界),还有 #include <locale.h>
,并添加
setlocale(LC_ALL, "");
在你的 main()
之前 read/scan 或 write/print 任何东西。 (虽然还有很多 可以 进一步本地化他们的程序,以上通常就足够了。处理文本文件应该使用宽字符串 (L"This is a ωide §tring liteℛal "
) 和wchar_t
和 wint_t
类型的字符串和字符,具有宽字符串 I/O 函数。它并不比在愚蠢的 [=44 中做更复杂或更难做对=]"The twenty-seven ASCII letters are sufficient for everyone, even if it makes your name into a dirty word in your native language" 方式.
如果你的老师没有提到这些,你应该问为什么。无法正确处理文件或文本 Nöminäl Änimäl needs more €, and cowbell
的程序在当今时代不应该被接受。在学习正确的方法之前,无需先学习错误的方法,因为正确的方法和错误的方法一样容易。