[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; }