fnmatch例項詳解(與readdir、opendir實現模糊查詢)
阿新 • • 發佈:2019-02-19
fnmatch:int fnmatch(const char *pattern, const char *string, int flags);
man中是這麼寫道:The fnmatch() function checks whether the string argument matches the pattern argument, which is a shell wildcard pattern. 就是判斷字串是不是符合pattern所指的結構。
- FNM_NOESCAPE
- 如果這個標誌設定了,處理反斜槓為普通字元,而不是轉義字元。
- FNM_PATHNAME
- 如果這個標誌設定了,string
- FNM_PERIOD
- 如果這個標誌設定了,string 裡的起始點號必須匹配 pattern 裡的點號。一個點號被認為是起始點號,如果它是string 第一個字元,或者如果同時設定了 FNM_PATHNAME,緊跟在斜槓後面的點號。
- FNM_FILE_NAME
- 這是 FNM_PATHNAME 的 GNU 同義語。
- FNM_LEADING_DIR
- 如果這個標誌(GNU 擴充套件)設定了,模式必須匹配跟隨在斜槓之後的 string 的初始片斷。這個標誌主要是給 glibc 內部使用並且只在一定條件下實現。
- FNM_CASEFOLD
- 如果這個標誌(GNU 擴充套件)設定了,模式匹配忽略大小寫。
返回值:0,string 匹配 pattern;FNM_NOMATCH,沒有匹配;或者其它非零值,如果出錯。
(程式來自網路)
#include <fnmatch.h> #include <stdio.h> #include <sys/types.h> #include <dirent.h> int main(int argc, char *argv[]) { char *pattern; DIR *dir; struct dirent *entry; int ret; dir = opendir(argv[2]); //開啟指定路徑 pattern = argv[1]; //路徑存在 if(dir != NULL) { //逐個獲取資料夾中檔案 while( (entry = readdir(dir)) != NULL) { ret = fnmatch(pattern, entry->d_name, FNM_PATHNAME|FNM_PERIOD); if(ret == 0) //符合pattern的結構 { printf("%s\n", entry->d_name); }else if(ret == FNM_NOMATCH){ continue ; }else { printf("error file=%s\n", entry->d_name); } } closedir(dir); } }