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