Если вы читаете TPOP, вы увидите, как они делают этот поиск во много раз быстрее с различными структурами данных и алгоритмами.
Но вы можете сделать вещи немного быстрее, заменив такие, как
for (i = 0; i < n; ++i)
foo(a[i]);
с
char **p = a;
for (i = 0; i < n; ++i)
foo(*p);
++p;
Если в конце массива есть известное значение (например, NULL), вы можете исключить счетчик цикла:
for (p = a; *p != NULL; ++p)
foo(*p)
Удачи, это отличная книга!