計算機科学のブログ

C - 高度な関数 - 関数を最大限に活用する - 関数引数, 関数ポインター

Head First C ―頭とからだで覚えるCの基本David Griffiths(著)、 Dawn Griffiths(著)、 中田 秀基(監修)、 木下 哲也(翻訳)、 O’Reilly Media)の7章(高度な関数 - 関数を最大限に活用する)、p.321(エクササイズ)の解答を求めてみる。

Makefile

all: main.c
	cc main.c && ./a.out

コード

main.c

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

int NUM_ADS = 7;
char *ADS[] = {"William: SBM GSOH likes sports, TV, dining",
               "Matt: SWM NS likes art, movies, theater",
               "Suis: SLM ND likes books, theater, art",
               "Mike: DWM DS likes trucks, sports and bieber",
               "Peter: SAM likes chess, working out and art",
               "Josh: SJM likes sports, moviesn and theater",
               "Jed: DBM likes theater, books and dining"};

int sports_or_workout(char *s)
{
    return strstr(s, "sports") || strstr(s, "workout");
}
int ns_theater(char *s)
{
    return strstr(s, "ns") && strstr(s, "theater");
}
int arts_theater_or_dining(char *s)
{
    return strstr(s, "arts") || strstr(s, "theater") || strstr(s, "dinidng");
}
void find(int (*match)(char *))
{
    puts("検索結果:");
    puts("--------------------");
    for (size_t i = 0; i < NUM_ADS; i++)
    {
        if (match(ADS[i]))
        {
            printf("%s\n", ADS[i]);
        }
    }
}

int main()
{
    int (*fns[])(char *) = {sports_or_workout, ns_theater, arts_theater_or_dining};
    for (size_t i = 0; i < 3; i++)
    {
        printf("%zu\n", i);
        find(fns[i]);
    }
}

入出力結果(Terminal, Zsh)

% make
cc main.c && ./a.out
0
検索結果:
--------------------
William: SBM GSOH likes sports, TV, dining
Mike: DWM DS likes trucks, sports and bieber
Josh: SJM likes sports, moviesn and theater
1
検索結果:
--------------------
2
検索結果:
--------------------
Matt: SWM NS likes art, movies, theater
Suis: SLM ND likes books, theater, art
Josh: SJM likes sports, moviesn and theater
Jed: DBM likes theater, books and dining
%