Ver Mensaje Individual
  #13 (permalink)  
Antiguo 21/05/2014, 03:16
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Contar Palabras de una frase? string

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
Por último, la versión con istringstream igual tiene al menos 1 problema, pero creo que permitiré que alguien más encuentre éste en vez de auto-inmolarme .
Bueno, pues llevo un rato dándole vueltas, y no sé en qué casos pueda fallar la versión con streams. La verdad es que es la forma más sencilla y clara.

Por aportar algo, añado a tu código la posibilidad de evitar el error cuando dos palabras están separadas por un punto y sin espacio:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <sstream>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. int cuenta( string s )
  8. {
  9.     istringstream is(s);
  10.     string token;
  11.     int cuenta = 0;
  12.     while(is >> token)
  13.         {
  14.             size_t found= token.find('.');
  15.             if (found!=string::npos)
  16.             {
  17.                 ++cuenta;
  18.             }
  19.             cout<<token<<endl;//quitar
  20.             ++cuenta;
  21.         }
  22.     return cuenta;
  23. }
  24.  
  25. int main()
  26. {
  27.     string frase="Contar palabras.Se me da bien";
  28.     cout<<"La frase '"<<frase<<"' tiene "<<cuenta(frase)<<" palabras."<<endl;
  29.     return 0;
  30.  
  31. }

P.D. A finales de semana, si nadie logra dar con el problema de tu método, nos lo dices!


Edito porque esta condición:
Código C++:
Ver original
  1. if (found!=string::npos)
considera que una palabra acabada en punto en todos los casos son 2 palabras, y sólo ha de ser cuando después del punto hay otra palabra sin espacio
Mejor poner así:
Código C++:
Ver original
  1. if (found!=string::npos & found!=token.length()-1)

Pienso que lo ideal sería sustituir todos los '.' por espacios y luego crear el stream, pero eso no es eficaz porque hay que recorrer la cadena 2 veces.
Otra forma sería que cuando el stream crease un string con un caracter punto, eliminarlo y proceder a crear de nuevo un stream y volver a tokenizarlo en strings. No es muy eficaz pero así contemplaría todos los casos en los que un caracter punto se viera involucrado.

¿Otras alternativas?

Última edición por dehm; 21/05/2014 a las 03:43