2010-06-01 10 views
6

Usando el tipo std::string para aceptar una oración, para practicar (no he trabajado mucho con cadenas en C++) Estoy comprobando si un personaje es una vocal o no. Tengo esto:C++: ¿Por qué el espacio siempre termina una cadena cuando se lee?

for(i = 0; i <= analyse.length(); i++) { 
if(analyse[i] == 'a' || analyse[i] == 'e' [..etc..]) { 
...vowels++;  
} else { ... 
...consonants++; 
} 

Esto funciona bien si la cadena es una sola palabra, pero la segunda me añadir un espacio (IE: AEIO aatest) sólo contará el primer bloque y contar el espacio como una consonante, y dejar de leer la oración (salir del bucle for o algo así).

¿Un espacio cuenta como sin carácter == nulo? ¿O algo raro con std::string? ¡Sería útil saber por qué está sucediendo eso!

EDIT: Simplemente estoy aceptando la cadena a través de std :: cin, tales como:

std::string analyse = ""; 
std::cin >> analyse; 
+0

No es std :: string, que puede contener cualquier carácter, incluidos espacios y nulos. Muestre cómo está leyendo en la cadena. –

+0

¿Cómo está configurando 'analyse'? ¿Qué obtienes si 'cout << analyse.length()'? ¿La cadena "aecio" cuenta correctamente? ¿Tal vez el problema está en la porción '...' del bloque else? –

+1

en un lado ... almacenar la longitud en una variable (const int ci = analyse.length();) funciones en el para son malas prácticas. – baash05

Respuesta

9

Supongo que está leyendo su cadena con algo como your_stream >> your_string;. El operador >> para cadenas está definido para trabajar (aproximadamente) igual que scanf, la conversión %s, que se lee hasta que encuentra espacios en blanco, por lo tanto, operator>> hace lo mismo.

Puede leer una línea completa de entrada en lugar de std::getline. También es posible que desee ver un answer que publiqué en una pregunta anterior (proporciona algunas alternativas a std::getline).

+0

Gracias por el enlace de respuesta, +1 – Nullw0rm

4

No puedo decir por el código que ha pegado, pero voy a ir en una extremidad y adivina que estás leyendo la cadena usando el operador de extracción de flujo (secuencia >> secuencia).

El operador de extracción de flujo se detiene cuando encuentra espacios en blanco.

Si esto no es lo que está pasando, ¿puede mostrarnos cómo está rellenando su cadena y cuáles son sus contenidos?

Si estoy en lo cierto, entonces querrá un método diferente para leer el contenido en la cadena. std :: getline() es probablemente el método más fácil de leer desde un archivo. Se detiene en líneas nuevas en lugar de en espacios en blanco.


Editar basado en cuestión Editado: (.. DoubleCheck la sintaxis no estoy frente a mi compilador) uso esto:

std::getline(std::cin, analyze); 

Esto debería dejar de leer cuando se pulsa "enter ".

2

Si desea leer en una línea completa (incluidos los espacios en blanco), entonces debe leer usando getline. Esquemáticamente se ve así:

#include <string> 
istream& std::getline(istream& is, string& s); 

Para leer toda la línea se hace algo como esto:

string s; 
getline(cin, s); 
cout << "You entered " << s << endl; 

PS: la palabra es "consonante", no "consenent".

+0

getline funciona bien. Me alegro de que no fue un problema al azar, me ayuda a aprender. – Nullw0rm

1

El operador >> en un istream separa cadenas en el espacio en blanco. Si desea obtener una línea completa, puede usar readline(cin,destination_string).

+0

¿Quizás pensó 'getline' en lugar de' readline'? Si bien hay bibliotecas que incluyen funciones llamadas 'readline', no es parte de la biblioteca estándar. –

+0

Sí, tenía la intención de obtener línea. (Y son otros ** idiomas ** que usan readline, que es la razón por la que me confundo). –

Cuestiones relacionadas