Wskaźnik na funkcje

W książce "Rusz głową C" znalazłem fajny przykład zastosowania wskaźników na funkcje.

Wyobraźmy sobie, że chcemy wyszukiwać określone wyrazy w tablicy znaków. W ten sposób musielibyśmy tworzyć kilka if'ow do każdego wyrazu oddzielny, a tym samym tworzyć kilka funkcji, które robią dokładnie to samo. Oczywiście w C jest możliwość stworzenia jednej funkcji szukającej i kilku funkcji z szukanymi słowami, które będą podmieniane.

Najpierw tworzymy wyrażenie, które chcemy wyszukać. W naszym przypadku szukamy słowa "Marcin" i "lubi" w jednym zdaniu:

int szukaj_marcin_lubi(char *s){
 return strstr(s,"Marcin")&&strstr(s,"lubi");
}

W tym przypadku stworzyliśmy funkcje szukaj_marcin_lubi(), aby ją zastosować w przykładzie, należy się do niej odwołać za pomocą int(*funkcja)(char*) tak jak to pokazałem w przykładzie:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

 int NUM_ADS=7;
 char *ADS[] = {
 "Tata lubi mame",
 "Marcin lubi frytki",
 "Michal kocha Jole",
 "Marcin kocha Zosie",
 "Mirek lubi fasole",
 "Franek mysli",
 "Jola rozrabia"
 };
 
void znajdz(int(*funkcja)(char*))
{
 int i;
 puts("Wyniki:");
 for(i=0;i<NUM_ADS;i++){
 if(funkcja(ADS[i])){
 printf("%s\n",ADS[i]);
 }
 }
}
int szukaj_marcin_lubi(char *s){
 return strstr(s,"Marcin")&&strstr(s,"lubi");
}
int szukaj_marcin_kocha(char *s){
 return strstr(s,"Marcin")&&strstr(s,"kocha");
}

int main(int argc, char *argv[]) {
 znajdz(szukaj_marcin_lubi);
 znajdz(szukaj_marcin_kocha);
 return 0;
}

Ten program wypisze wszystkie wiersze, gdzie występuje Marcin z lubie i Marcin z kocha:

Wyniki:
Marcin lubi frytki
Wyniki:
Marcin kocha Zosie

Oczywiście słowa szukane można łączyć z różnymi operatorami logicznymi, np || (lub) i !(różne).