фильтр сканирования по подстроке

Я пытаюсь отфильтровать scandir по подстрокам. У меня работает моя функция, но только с заданной строкой.

int nameFilter(const struct dirent *entry) {
    if (strstr(entry->d_name, "example") != NULL)
        return 1;
    return 0;
}

Но я не могу найти способ отфильтровать argv[i], потому что я не могу его объявить.

int (*filter)(const struct dirent *)

Ребята, вы знаете какое-нибудь решение?


person blackout    schedule 15.01.2016    source источник
comment
Итак, я нашел ответ здесь: (stackoverflow.com/questions/18780788/).   -  person blackout    schedule 15.01.2016


Ответы (2)


Возможно, вам придется использовать глобальную переменную со всеми плохими побочными эффектами, если она используется в многопоточной среде или из обработчика сигналов:

static const char *global_filter_name;

int nameFilter(const struct dirent *entry) {
    return strstr(entry->d_name, global_filter_name) != NULL;
}

и установите global_filter_name перед вызовом scandir.

person chqrlie    schedule 15.01.2016
comment
Да. Я нашел и ответил здесь: (stackoverflow.com/questions/18780788/). В любом случае еще раз спасибо :) - person blackout; 15.01.2016

Ваша функция не рискует рекурсией, поэтому:

Вы можете использовать объект static-storage-duration или thread-storage-duration для дополнительного контекста:

/* At file scope */
static const char ** filter_names;

/* ... */

/*
 * Prior to being invoked, populate filter_names
 * with a pointer into an array of pointers to strings,
 * with a null pointer sentinel value at the end
 */
int nameFilter(const struct dirent *entry){
    const char ** filter;

    for (filter = filter_names; *filter; ++filter) {
        if(strstr(entry->d_name,*filter) != NULL)
            return 1;
      }
    /* chqrlie correction */
    return 0;
}
person synthetel    schedule 15.01.2016
comment
Я вижу, что ты сделал. В любом случае мне просто нужен параметр argv[], но это определенно сработает. Спасибо. - person blackout; 15.01.2016
comment
Переместите return 0; из тела цикла for. - person chqrlie; 15.01.2016