Acabo de arreglar el fallo en el ejemplo que puse para C++.
Esta es otra forma de contar palabras, esta vez para C.
Básicamente cuenta las transiciones entre palabras y secuencias de espacios en blanco:
main.c
#include <stdio.h>
int contarPalabras(const char* cadena)
{
int cambios = 1;
int anteriorEsEspacio = 1;
int actualEsEspacio;
if (0 == cadena) return 0;
while (*cadena)
{
actualEsEspacio = isspace(*cadena) != 0;
cambios += actualEsEspacio ^ anteriorEsEspacio;
anteriorEsEspacio = actualEsEspacio;
cadena++;
}
return cambios / 2;
}
void imprimirPalabras(const char* cadena)
{
printf("%s\nPalabras: %d\n\n", cadena, contarPalabras(cadena));
}
int main()
{
imprimirPalabras("");
imprimirPalabras(" ");
imprimirPalabras("una");
imprimirPalabras(" una");
imprimirPalabras("una ");
imprimirPalabras(" una ");
imprimirPalabras(" dos palabras ");
imprimirPalabras("dos palabras");
imprimirPalabras(" Varias palabras separadas por uno o varios espacios");
imprimirPalabras("Varias \n Palabras\n en \n varias \nlineas");
}