Я хочу прочитать несколько символов в C ++, но он никогда не читает второй символ - PullRequest
0 голосов
/ 22 октября 2018

Я хочу просто прочитать два символа в C ++, но он не может занять второй символ !!

#include <iostream>
#include <sstream>

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;
}

Может кто-нибудь помочь мне решить эту проблему?

Это вывод:

reading char: a

a

reading char:


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

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

Программа заканчивается здесь, и она не читает второй символ

Ответы [ 4 ]

0 голосов
/ 22 октября 2018

Проблема здесь в том, что стандартный ввод (std::cin) буферизован.Таким образом, программа не получает никакого ввода, пока не будет нажата клавиша <return> (или вы не заполните буфер).Это создает впечатление, что код всегда будет ждать ввода пользователя.

Это не так.Он будет только ждать ввода пользователя, если текущий буфер пуст.Если в буфере есть данные, он будет читать их, а не ждать ввода пользователя.

Первое чтение:

cin.get(ch1);

Запуск программы, поэтому буфер пуст.Поэтому, когда вы читаете из std::cin, программа приостанавливает ожидание сброса буфера, после чего символы будут прочитаны.Если вы нажмете A<return>, ваш буфер заполнится двумя символами в буфере.

Buffer: 'A' '\n'

Теперь ваше чтение будет извлекать первый символ из ввода: 'A', оставляя '\n' во входном потоке:

Buffer: '\n'

Теперь при втором чтении буфер не пуст.

cin.get(ch2);

И не нужно ждать, он прочитает следующий символ из потока.Таким образом, он читает символ '\n' из потока.и продолжается.

Решения:

Это зависит от того, что вы хотите.Вы хотите только первый символ из строки?

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.

Вы просто хотите игнорировать пробел?(это пробел / табуляция / перевод строки и т. д.).

std::cin >> v1 >> v2;

Использование operator>> игнорирует начальный пробел, а затем считывает следующее значение.Поэтому он будет игнорировать новые строки (это пробелы).

0 голосов
/ 22 октября 2018

Если вы введете первый символ и нажмете ввод, то символ новой строки (ASCII 10) будет прочитан вторым вызовом get ().

0 голосов
/ 22 октября 2018

Проблема в том, что когда вы вводите символ и затем нажимаете ввод, вы вводите символ новой строки в консоль.Таким образом, вызов cin.get() возвращает символ новой строки ch2, и ваша программа затем печатает ch1 и пустой символ новой строки ch2 и завершается.

Вместо использования cin.get() следует использовать cin >> ch1 и cin >> ch2

0 голосов
/ 22 октября 2018

Ваша проблема здесь get захватывает только один символ из потока.Когда вы вводите символ для первого ввода, набирая символ и нажимая ввод, вы фактически помещаете два символа в поток.Тот, который вы ввели, а затем введите ключ (символ новой строки).Это означает, что ваш второй вызов get собирается получить символ новой строки, который все еще находится в буфере, и не будет ждать, пока вы что-нибудь введете.Чтобы исправить это, вы должны использовать оператор извлечения потока (operator >>), чтобы прочитать один символ, и он пропустит пробел, оставленный в буфере.Это превращает ваш код в

int main()
{

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

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


    return 0;
}
...