2011-02-15 36 views

Respuesta

36

Al leer desde std::cin, es preferible no usar stream extraction operator>> ya que esto puede tener todo tipo de efectos secundarios desagradables. Por ejemplo, si usted tiene este código:

std::string name; 
std::cin >> name; 

Y entrar en John Doe, entonces la línea a leer desde cin se acaba de celebrar el valor John, dejando detrás Doe para ser leído por una futura operación de lectura. Del mismo modo, si tuviera que escribir:

int myInteger; 
std::cin >> myInteger; 

Y luego escribo en John Doe, a continuación, cin entrará en un estado de error y se niegan a hacer cualquier futura operaciones de lectura hasta que explícitamente en claro su estado de error y eliminar los caracteres que causó el error

Una mejor forma de ingresar al usuario es usar std::getline para leer los caracteres del teclado hasta que el usuario presione enter. Por ejemplo:

std::string name; 
getline(std::cin, name); // getline doesn't need the std:: prefix here because C++ has ADL. 

ADL representa las operaciones de búsqueda argumento dependientes. Ahora, si ingreso John Doe, el valor de name será John Doe y no quedarán datos en cin. Por otra parte, esto también le permite probar si el usuario teclee enter:

std::string name; 
getline(std::cin, name); 

if (name.empty()) { 
    /* ... nothing entered ... */ 
} 

El inconveniente del uso de este enfoque es que si quieres leer en una línea de datos con formato, un int o una double que tendrá que analizar la representación de la cadena. Personalmente creo que esto vale la pena porque le da un control más preciso de qué hacer si el usuario ingresa algo inválido y "guarda" cin para que nunca entre en un estado fallido.

Enseño un curso de programación en C++, y tengo some lecture notes about the streams library que contiene una gran cantidad de detalles sobre cómo leer datos formateados desde cin de manera segura (principalmente al final del capítulo). No estoy seguro de lo útil que encontrará esto, pero en caso de que sea útil, pensé en publicar el enlace.

Espero que esto ayude!

+0

Gracias por esta respuesta, realmente me ayudó con un programa en el que estoy trabajando. Pongo este comentario porque encontré algo interesante. Tengo una instrucción if-else que verifica si el usuario ingresa "y", "n", algo más o nada en absoluto. Descubrí que el programa no alcanzará el caso de "nada en absoluto" a menos que inicie el if-else con ese caso. No estoy seguro si eso también le pasó a otras personas. –

-7
int main(){ 
string str[100]; 
std::cout<<"Hello how are you ? \n"; 
std::cin>>str; 
if(str.length() > 0){ 
// If input is seen 
} 
else{ 
// If input is not seen 
} 
} 

Cualquier problema, házmelo saber.

+0

Esto está mal. cin esperará hasta que haya una entrada válida. – Marlon

+0

No tengo compilador, así que no puedo verificar. pero gracias por decirme. – JesusChrist

+0

Istreams no tienen un extractor para un puntero de cadena (su str es una matriz de cadenas). Siempre puede [usar un compilador en línea para verificar] (http://codepad.org/AMt9sDzN). –

3

cin no continuará con el programa a menos que el usuario ingrese al menos 1 carácter (ingresar no cuenta). Si el usuario no da CUALQUIER entrada, cin seguirá esperando que el usuario ingrese y luego presione enter.

+1

Casi cierto; depende de qué operación hagas con cin. –

+0

@ Fred-Nurk - ¿Me puede dar un ejemplo? – matzahboy

+0

Getline fue mencionado en otra respuesta, pero cin.get y cin.ignore son otros. –

-3

La forma más simple >>

{ 
char X=0; // ASCII(0) means a NULL value 
cin>>X; 
if(X==0 || X==10) // ASCII(10) means ENTER 
cout<<"User din't enter ANYTHING !! "; 
} 

Pero es un problema sencillo ....

CIN simplemente no permitirá que se mueva más allá sin introducir un carácter

por el carácter aquí me refiero a un dígito o alfabeto o símbolo especial, no en el espacio, introduzca nula etc

Esperanza esto resuelve tu problema, si no lo hace, estaré encantado de ayudar solo házmelo saber.

Cuestiones relacionadas