2016-06-22 11 views
0

フィルタ名> 5文字の2つの関数を記述する必要があり、型で並べ替える必要があります。Scandir独自のフィルタ関数

Filtr関数は次のようになりますか?

int (* filter) (const struct dirent* entry) { 

    if ((strlen(entry>d_name) - 1) > 5) { 
     return entry; 
    } 
} 

どのようにdirentのdirent-> d_typeで並べ替えるのですか?

+1

'int filter(const struct dirent * entry)' ...関数ポインタを 'scandir()'に渡しますが、フィルタ関数自体はポインタとして宣言されていません。 – Dmitri

+0

'return entry'が正しくありません。戻り値の型はint型なので、0または1を返すと仮定します。 – user3386109

答えて

1

man 3 scandirページをご覧ください。

(私は最新のCライブラリおよびシステム・レベルのプログラミングのためのLinux man-pages project manページを見つける。)

私達は私達の機能を行うために呼び出す必要がヘルパー関数を指定するには、呼び出し元が必要な機能を持っている場合いくつかのタスクでは、関数ポインタと宣言します。言い換えれば、scandir()関数のプロトタイプは、フィルタと比較関数のプロトタイプは、(あなたの運動の要件を満たしていない)機能のための愚かな実装

実際

int myfilter(const struct dirent *); 
int mycompar(const struct dirent **, const struct dirent **); 
ある

int scandir(const char *dirp, struct dirent ***namelist, 
      int (*filter)(const struct dirent *), 
      int (*compar)(const struct dirent **, const struct dirent **)); 

ありながら、 POSIX.1-2008を使用してコードを書くとき、たとえば可能性があり

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

を追加することを忘れないでください
#define _POSIX_C_SOURCE 200809L 

より前には、いずれも#includeがあります。あなたのコードの作業も#include <locale.h>、(例えば、当社の世界中のすべてのLinuxシステムでは、ファイル名に代わりバイト文字を数えて)異なる環境で正しく行い、あなたのmain()

setlocale(LC_ALL, ""); 

を追加するには読み取り/スキャンや書き込み/印刷を行う前に(テキストファイルの処理は、ワイド文字列(L"This is a ωide §tring liteℛal ")とwchar_twint_tの種類の文字列と文字を使用して行う必要があります。文字列の入出力機能。それは愚かな人で行うよりも複雑で難しいことではありません"あなたの名前があなたの中の汚い言葉になっても、27文字のASCII文字で十分です。母国語 " way。

教師にこれらのことが言及されていない場合は、理由を尋ねる必要があります。ファイルまたはテキストを処理できないプログラムNöminäl Änimäl needs more €, and cowbellは、この日に受け入れられません。最初に間違った方法を学ぶ必要はありません正しい方法は間違った方法と同じくらい簡単なので、正しい方法を学ぶ前に物事を行うこと。

関連する問題