Ver Mensaje Individual
  #5 (permalink)  
Antiguo 29/11/2013, 23:01
Avatar de guzzano
guzzano
 
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 9 meses
Puntos: 13
Respuesta: contar palabras de una cadena

El código tuyo falla porque estás contando los espacios, cuando escribes: Hola, qué tal tiene solo dos espacios, por lo tanto, para el programa solo tienes dos palabras. Si colocas una palabra, te dirá que hay cero palabras porque no tiene ningún espacio.

Así que porto una solución.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. size_t
  5. countword (const char * words)
  6. {
  7.   const char * aux;
  8.  
  9.   size_t len = 0;
  10.   size_t wds = 0;
  11.  
  12.   aux = words;
  13.   len = strlen(words);
  14.  
  15.   if (words == 0 || len <= 0)
  16.     return 0;
  17.  
  18.   while (1)
  19.   {
  20.     if (!len)
  21.       break;
  22.    
  23.     if (*(words) == 0x20)
  24.       wds++;
  25.    
  26.     words++;
  27.     len--;
  28.   }
  29.  
  30.   return (wds == 0 ? wds : wds+1);
  31. }
  32.  
  33. int
  34. main (void)
  35. {
  36.   printf("%zu", countword("Buenos días eh."));
  37.  
  38.   return 0;
  39. }

Aunque puede ser optimizado este código, solo te doy un ejemplo, además, como te dijo vosk en un escenario real puedes encontrarte con cadenas mal espaciadas; Como por ejemplo: Hola[espacio][espacio][espacio]como[espacio][espacio][espacio]estas, esto dirá que hay 6 palabras.

Aunque se podría dejar atrás esa lógica de contar las palabras por los espacios en la cadena y aplicar otra solución así:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. size_t
  6. countword (const char * words)
  7. {
  8.   const char * aux;
  9.  
  10.   size_t len = 0;
  11.   size_t wds = 0;
  12.   unsigned int w = 0;
  13.  
  14.   aux = words;
  15.   len = strlen(words);
  16.  
  17.   if (words == 0 || len <= 0)
  18.     return 0;
  19.  
  20.   while (1)
  21.   {
  22.     if (!len)
  23.       break;
  24.    
  25.     if (w != 1 && isalpha(*words)) {
  26.       w = 1;
  27.       wds++;
  28.     }
  29.    
  30.     if (*(words) == 0x20)
  31.       w = 0;
  32.    
  33.     words++;
  34.     len--;
  35.   }
  36.  
  37.   return wds;
  38. }


Un saludo.