Я хочу прочитати кілька символів в C ++, але він ніколи не читає другий символ

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

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

хто може допомогти мені вирішити цю проблему?

Це вихід:

reading char: a

a

reading char:


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

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

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

1
Працює для мене. У чому проблема? Невже це? Помилка? echo "test" | ./test , наприклад, виводить правильний вивід.
додано Автор tadman, джерело
Програма закривається занадто швидко, щоб побачити вихід?
додано Автор Matt, джерело
Немає помилки! Просто поставте 'n' на другий символ і не візьмете його від користувача
додано Автор Shahab Einabadi, джерело

5 Відповіді

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.

Це не правда. Вона буде чекати тільки введення користувача, якщо поточний буфер порожній. Якщо в буфері є дані, вони читатимуть, а не чекають введення даних користувача.

Перше читання:

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'

Тепер ваше читання отримає перший символ зі вводу: 'A' , залишивши '\ t

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;

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

1
додано

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
додано

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

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

1
додано
так що немає можливості використовувати cin.get() ???
додано Автор Shahab Einabadi, джерело

Якщо ввести перший символ і натиснути enter, символ нового рядка (ASCII 10) зчитується другим викликом get ().

1
додано

Коли ви говорите, що не може прийняти другий символ, ви маєте на увазі, що він не читає? Або що він не пише це на екран?

Можливо, ви хочете додати cout для "Натисніть будь-яку клавішу для продовження" і прочитати інший фіктивний символ.

0
додано
вона не читає. Він просто ставить 'n' автоматично на другий символ, не читає його від користувача
додано Автор Shahab Einabadi, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147