Cita:
Iniciado por CalgaryCorpus 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#include <iostream>
#include <sstream>
#include <string.h>
using namespace std;
int cuenta( string s )
{
istringstream is(s);
string token;
int cuenta = 0;
while(is >> token)
{
size_t found= token.find('.');
if (found!=string::npos)
{
++cuenta;
}
cout<<token<<endl;//quitar
++cuenta;
}
return cuenta;
}
int main()
{
string frase="Contar palabras.Se me da bien";
cout<<"La frase '"<<frase<<"' tiene "<<cuenta(frase)<<" palabras."<<endl;
return 0;
}
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:
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 originalif (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?