2009-03-10 29 views
5

Me he dado cuenta de que cada vez que escribo un programa que utiliza std::cin que si quiero que el usuario presione Enter para finalizar el programa, tengo que escribir std::cin.ignore() dos veces para obtener el comportamiento deseado. Por ejemplo:¿Por qué es necesario un segundo cin.ignore()?

#include <iostream> 

int main(void) 
{ 
    int val = 0; 
    std::cout << "Enter an integer: "; 
    std::cin >> val; 

    std::cout << "Please press Enter to continue..." << std::endl; 

    std::cin.ignore(); 
    std::cin.ignore(); // Why is this one needed? 
} 

También he notado que cuando no estoy usando cin de entrada real, sino más bien para la llamada ignore() al final, lo único que necesita uno.

+0

¿Está ejecutando Linux o Windows, puede ser causa de el problema CRLF si ejecuta Windows ... – Ben

+0

El mismo "problema" ocurre en Solaris. No tiene nada que ver con CRLF. –

Respuesta

8

Discl: Estoy simplificando lo que realmente sucede.

El primero sirve para purgar lo que el operador de extracción (>>) no ha consumido. El segundo espera por otro \ n.

Es exactamente lo mismo cuando hacemos un std :: getline después de una extracción: se requiere un the_stream::ignore(std::numeric_limits<streamsize>::max(), '\n'); antes de la llamada a std :: getline()

+3

Ah, ya veo. Entonces, si los caracteres que ingresa en el primer aviso son "123 \ n", usted está diciendo que el operador >>() deja solo esa "\ n", y la primera ignora() la lee; luego, el segundo ignorar() espera a que presione una tecla y la lea (la 2ª "\ n"). +1. –

+0

Esa es la idea. –

0

Eso es extraño. ¿En qué plataforma estás corriendo? Por definición, ignore extrae y descarta n caracteres de la corriente de entrada o si golpea EOF se detiene. Si no especifica ningún parámetro, extrae 1 carácter. En Windows, el final de línea implica tanto un \r como un \n - un total de dos caracteres (un retorno de carro seguido de una nueva línea).

+0

Lo pensé al principio también, pero se supone que la biblioteca debe abstraer cualquier esquema de final de línea que use la plataforma, y ​​su código de aplicación solo debería ver "\ n". –

Cuestiones relacionadas