Quiero leer algunos caracteres múltiples en C ++ pero nunca lee el segundo char

I want simply read two chars in C++ but it can't take the second char!!

#include 
#include 

using namespace std;

int main()
{

    cout << "reading char: ";
    char ch1;
    cin.get(ch1);
    cout << ch1 << endl;

    char ch2;
    cout << "reading char: ";
    cin.get(ch2);
    cout << ch2 << endl;


    return 0;
}

¿Puede alguien ayudarme a solucionar este problema?

Esta es la salida:

reading char: a

a

reading char:


Process returned 0 (0x0)   execution time : 2.158 s
Press any key to continue.

*************************

El programa termina aquí, y no lee el segundo el char

1
Funciona para mi. ¿Cuál es el problema que tienes? ¿Se atasca? Error fuera? echo "prueba" | ./test por ejemplo produce la salida correcta.
agregado el autor tadman, fuente
Programa se cierra demasiado rápido para ver la salida?
agregado el autor Matt, fuente
¡No hay error! Simplemente ponga '\ n' en el segundo carácter y no lo tome del usuario
agregado el autor Shahab Einabadi, fuente

5 Respuestas

The problem here is that standard input (std::cin) is buffered. So the program gets no input until the key is presses (or you fill the buffer). This gives you the impression that the code will always wait for user input.

Esto no es verdad. Solo esperará la entrada del usuario si el búfer actual está vacío. Si hay datos en el búfer, se leerá eso en lugar de esperar la entrada del usuario.

La primera lectura:

cin.get(ch1);

Start of the program so the buffer is empty. So when you read from std::cin the program will pause waiting for the buffer to be flushed then the characters will be read. If you hit A your buffer will flush with two characters in the buffer.

Buffer: 'A' '\n'

Su lectura ahora recuperará el primer carácter de la entrada: 'A' dejando '\ n' en el flujo de entrada:

Buffer: '\n'

Ahora la segunda lectura ve que el búfer no está vacío.

cin.get(ch2);

Y no necesita esperar, leerá el siguiente carácter de la transmisión. Entonces lee el carácter '\ n' de la transmisión. y continúa.

Soluciones:

Eso depende de lo que quieras. ¿Quieres solo el primer carácter de la línea?

std::cin.ignore();//drops the rest of the line.
                  //The next character that will be available will
                  //be the first character of the next line.

¿Solo quieres ignorar el espacio en blanco? (esto es espacio/tab/newline etc).

std::cin >> v1 >> v2;

Using the operator>> ignores leading white space, then reads the next value. So it will ignore new lines (they are white space).

1
agregado

Your issue here is get only grabs a single character from the stream. When you enter character for your first input by typing the character and pressing enter you actually put two characters into the stream. The one you entered and then enter key (newline character). That means your second call to get is going to get the newline character that is still in the buffer and not wait for you to enter anything. To fix this you should use the stream extraction operator (operator >>) to read the single character and it will skip over the white space that is left in the buffer. That turns your code into

int main()
{

    cout << "reading char: ";
    char ch1;
    cin >> ch1;
    cout << ch1 << endl;

    char ch2;
    cout << "reading char: ";
    cin >> ch2;
    cout << ch2 << endl;


    return 0;
}
1
agregado

El problema es que cuando ingresas un char y luego presionas enter, estás ingresando un carácter de nueva línea en la consola. Así que la llamada a cin.get() devuelve la nueva línea a ch2 y su programa imprime ch1 y una nueva línea en blanco de ch2 y salidas.

Instead of using cin.get() you should use cin >> ch1 and cin >> ch2

1
agregado
así que no hay manera de usar cin.get() ???
agregado el autor Shahab Einabadi, fuente

Si ingresa el primer carácter y presiona intro, la segunda llamada get() lee el carácter de nueva línea (ASCII 10).

1
agregado

Cuando dices que no puede tomar la segunda charla, ¿quieres decir que no la lee? ¿O que no lo escriba en la pantalla?

Es posible que desee agregar un cout para "Presionar cualquier tecla para continuar" y leer otro personaje falso.

0
agregado
no lo lee. Simplemente coloca '\ n' automáticamente en el segundo carácter, no lo lee el usuario.
agregado el autor Shahab Einabadi, fuente