Foros del Web » Programación para mayores de 30 ;) » C/C++ »

contar palabras de una cadena

Estas en el tema de contar palabras de una cadena en el foro de C/C++ en Foros del Web. necesito contar palabras que hay en una cadena de caracteres pero la manera en que lo hago no sale si pongo vacio me salta uno ...
  #1 (permalink)  
Antiguo 27/11/2013, 11:48
 
Fecha de Ingreso: septiembre-2010
Mensajes: 101
Antigüedad: 13 años, 7 meses
Puntos: 0
contar palabras de una cadena

necesito contar palabras que hay en una cadena de caracteres

pero la manera en que lo hago no sale
si pongo vacio me salta uno
si pongo 4 palabras me salta 3
y me estoy mareando bastante
les dejo el codgio por si quieren verlo

Código C:
Ver original
  1. void contarPalabras(char cadena[])
  2. {
  3.     int contador = 0;
  4.     int i = 0;
  5.     int largo = strlen(cadena);
  6.     int bolle =0;
  7.  
  8.    
  9.     for( i = 0; i < largo ; i++)
  10.     {
  11.  
  12.         if(cadena[i] == ' ' && cadena[i+1] != ' ')
  13.         {
  14.            
  15.             contador ++;
  16.         }
  17.        
  18.    
  19.     }
  20.  
  21.     printf("la cantidad de palabras es %d \n", contador);
  22. }
  #2 (permalink)  
Antiguo 28/11/2013, 00:18
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: contar palabras de una cadena

As veces no hay que reinventar la rueda :D
Mira este código a ver mas o menos que haces mal o lo que puedes mejorar :D
Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.      char oracion[100];
  8.      int i, contPalabras = 1;
  9.  
  10.      printf("Ingrese una oracion: ");
  11.      fgets(oracion, 100, stdin);
  12.  
  13.      for(i = 0; i < strlen(oracion); i++)
  14.           if(oracion[i] == ' ' && i > 0 && oracion[i - 1] != ' ')
  15.                contPalabras++;
  16.  
  17.      printf("Cantidad de palabras: %d\n", contPalabras);
  18.  
  19.      system("pause");
  20.      return 0;
  21. }

Sacado de http://answers.yahoo.com/question/in...2193523AAcrImE
Código echo por ale.NET
  #3 (permalink)  
Antiguo 28/11/2013, 09:48
Avatar de Swastik  
Fecha de Ingreso: noviembre-2013
Mensajes: 9
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: contar palabras de una cadena

Cita:
Iniciado por eke_ps Ver Mensaje
necesito contar palabras que hay en una cadena de caracteres

pero la manera en que lo hago no sale
si pongo vacio me salta uno
si pongo 4 palabras me salta 3
y me estoy mareando bastante
les dejo el codgio por si quieren verlo

Código C:
Ver original
  1. void contarPalabras(char cadena[])
  2. {
  3.     int contador = 0;
  4.     int i = 0;
  5.     int largo = strlen(cadena);
  6.     int bolle =0;
  7.  
  8.    
  9.     for( i = 0; i < largo ; i++)
  10.     {
  11.  
  12.         if(cadena[i] == ' ' && cadena[i+1] != ' ')
  13.         {
  14.            
  15.             contador ++;
  16.         }
  17.        
  18.    
  19.     }
  20.  
  21.     printf("la cantidad de palabras es %d \n", contador);
  22. }

Mira lo que veo es que hay que hacer es inicializar el contador en 1 ya que la función es contar los espacios para las palabras, entonces cuando introducimos la palabra lógicamente no hay espacio en el 1er elemento a menos que si le agreguemos espacio.

PD: para que esta int bolle =0;?
  #4 (permalink)  
Antiguo 28/11/2013, 17:04
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: contar palabras de una cadena

Aun cuando las propuestas anteriores son perfectas te comento que tambien puedes tokenizar por espacios:

Código C:
Ver original
  1. char *pch, tok[] = " ";
  2. int ctd = 0;
  3.  
  4. pch = strtok(text, tok);
  5. do {
  6.     ctd++;
  7. } while (pch = strtok(0, tok));

Esto te permite de una forma simple añadir modificaciones; supongamos que quieres contar palabras en idiomas que aceptan el apostrofe sin mediar espacios: "They're some things", en este caso el contador de palabras por espacios te dirá que hay 3 palabras cuando en verdad hay 4, lo solucionas añadiendo el caracter apostrofe al token char tok[] = " '" O en idiomas donde los pronombres se apostillan al final separados por un guion: "Pots deixar-me tal cosa", en este caso amplias los tokens con el guion char tok[] = " '-"

Recuerda que todo esto no sirve en el mundo real donde puedes encontrar frases mal espaciadas, tendrias que guardar una copia de la palabra anterior para ver que realmente es una palabra, etc... Tal vez te interesará mirar algo de expresiones regulares, pero ya te comento ahora que eso de las regex pueden complicarse hasta lo impensable.

Saludos
vosk
  #5 (permalink)  
Antiguo 29/11/2013, 23:01
Avatar de 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.
  #6 (permalink)  
Antiguo 29/11/2013, 23:02
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 9 meses
Puntos: 13
Exclamación Respuesta: contar palabras de una cadena

Doble post, lo siento. Pero para aprovechar,

Cita:
Iniciado por vangodp Ver Mensaje
As veces no hay que reinventar la rueda :D
La mejor forma de aprender es reinventado la rueda, aún así, cuando no se vaya a utilizar. Desde mi experiencia propia.

Saludos.

Última edición por guzzano; 29/11/2013 a las 23:07 Razón: Error.
  #7 (permalink)  
Antiguo 30/11/2013, 00:50
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: contar palabras de una cadena

Soy yo que le tengo que hacer los deberes???
No lo sabia XDD
Lo que el quiere es que le esclarescan su problema, yo a mi me da igual.
Si su programa no anda y lo ha intentado al menos, pegar un trozo de código aqui para que le de una idea no creo que sea malo.
Ademas no se ha quejado o sea que le servio para algo :D
Ahora si el ha echo un copy/paste es su problema no mio.
A la hora de buscar un trabajo a ver como saca la chuleta XDD
  #8 (permalink)  
Antiguo 30/11/2013, 04:56
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: contar palabras de una cadena

@guzzano: mejor tu segunda funcion que la primera, en la primera si entras 'hola' te cuenta 0 palabras. Mas abajo cualgo una implemetacion de tu idea.

@vangodp: lo mismo, si entras un texto vacío te cuenta 1 palabra, es decir que cumple la faena pq cuenta palabras pero la cumple mal. Imagina un empleado de un banco que su trabajo consiste en contar billetes: el trabajo de contar billetes lo hace, hasta aqui todo bien, pero si los cuenta mal la cosa ya no vale.

La version de guzzano de determinar las palabras en funcion de los espacios parece una buena opcion, voy a implementar algo mas de codigo siguiendo la misma idea de contar por separadores pero con mas separadores (ya que lo hacemos que sea a lo grande):

Código C:
Ver original
  1. int main() {
  2.     char ch, txt[] = "esto.es una     frase., ., ., de, prueba";
  3.     int q, w, soff, eoff, colisiones, falsos_positivos;
  4.     char tokens[] = " ',.;:-_!?¿¡(){}[]|@#~%&/\\";
  5.  
  6.     soff = eoff = 0;
  7.     colisiones = 0;
  8.     falsos_positivos = 0;
  9.     if(strlen(txt)) {
  10.         for(q = 0; q <= strlen(txt); q++) {
  11.             ch = (q == strlen(txt))? tokens[0]:txt[q];
  12.             if(chrmatch(tokens, ch)) {
  13.                 eoff = q;
  14.                 if(soff < eoff) {
  15.                     colisiones++;
  16.                     printf("[");
  17.                     for(w = soff; w < eoff; w++) {
  18.                         printf("%c", txt[w]);
  19.                     }
  20.                     printf("]");
  21.                 }
  22.                 else {
  23.                     falsos_positivos++;
  24.                 }
  25.                 soff = eoff+1;
  26.             }
  27.         }
  28.     }
  29.  
  30.     printf("\nCreo que hay %d palabras y %d falsos positivos\n", colisiones, falsos_positivos);
  31.  
  32.     return 0;
  33. }

La funcion chrmatch no existe, solo es un buscador de caracteres dentro de una lista, me sirve para determinar si un caracter está en la lista de caracteres que considero separadores:

Código C:
Ver original
  1. char chrmatch(char *lista, char ch) {
  2.     int q;
  3.     for(q = 0; q < strlen(lista); q++) {
  4.         if(lista[q] == ch) {
  5.             return 1;
  6.         }
  7.     }
  8.     return 0;
  9. }

Los falsos positivos son un separador seguido de otro separador (es decir un separador que separa otro separador), que con la busqueda directa me contaria como palabra. Si quiero usar mas separadores solo tengo que añadirlos como caracter a la lista de tokens. De igual forma puedo ampliar la funcionalidad añadiendo una lista de palabras excluidas. La parte que muestra los caracteres es solo para ver que está haciendo, el comparador que determina si es algo significativo es el de la distancia entre offsets.

@vangodp: ya se que estoy haciendo los deberes de otro, pero a veces practicando tambien se aprende. Tu has copiado y pegado un codigo de otro sitio que como te comenté mas arriba en determinados casos da un resultado erroneo, pero no te hubiese costado nada hacer un par de pruebas para ver como responde. No te lo tomes mal, es solo mi opinion ;)

Saludos
vosk

Última edición por vosk; 30/11/2013 a las 05:03

Etiquetas: cadena, int, palabras
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:47.