Contagem de caracteres UTF-8 em uma string

[Enunciado]  Vamos supor que todos os bytes da string são válidos, ou seja, estão acordo com a codificação UTF-8.  Primeiro, uma solução caseira:

int numCaracteres (char *s) {
   int len = 0;
   for (int i = 0; s[i] != '\0'; ++i) {
      if ((unsigned char) s[i] < 128) len++;
      else if ((unsigned char) s[i] > 191) len++;
   }
   return len;
}

Veja a estrutura do código UTF-8 para entender a função.

Agora uma solução mais eficiente:

int numCaracteres (char *s) {
   int len = 0;
   while (*s) len += (*s++ & 0xc0) != 0x80;
   return len;
}