C++ input / output (getchar)

int show_menu()
{
    std::cout << "\n\n1.Строка\n2.Число\n3.Число с плавающей точкой\n4.Число с плавающей точкой двойной точности\n5.Символ"<< std::endl;
    std::cout << "Введите цифру: ";
    int menu_choice;
    std::cin >> menu_choice;
    return menu_choice;
}

int menu_choice = show_menu();

отрывок из main()

case 5:
{
    std::cout << "\nВведите символ: ";
    int ch = getchar();
    std::cout << "Вввели: " << ch << "\tРезультат ---> ";
    for (int i = 7; i >= 0; i--)
    {
        std::cout << ((ch >> i) & 1);
    }
    end_work = '-';
    break;
}

Консоль:

введите сюда описание изображения

Не очень понимаю, что происходит, почему в переменную ch передаётся результат функции, а не происходит ввод от пользователя. То есть мы в show_menu() в cin ввели к примеру 5 и это же перенеслось в переменную сh. (Как это исправить?)


Ответы (1 шт):

Автор решения: EOF

Всё дело в том, что после того, как cin прочитает число, он оставит в потоке ввода символ новой строки (который Вы создаёте, когда нажимаете Enter после ввода числа). Потом функция getchar читает этот символ новой строки (\n) и сохраняет результат в переменную ch, которая имеет тип int. Если заглянуть в ASCII таблицу, то можно увидеть, что символ новой строки имеет код 10, что Вы и наблюдаете в выводе переменной ch. Вы видите именно 10, потому что ch имеет тип int и cout отображает содержимое переменной в виде числа, а не символа.
Чтобы исправить ситуацию, Вам необходимо после ввода числа также прочитать всё до конца строки (т.е. до символа \n). Это можно сделать с помощью строки

cin.ignore(numeric_limits<streamsize>::max(), '\n');

Ещё, в виде рекомендации, вместо getchar() лучше использовать cin.get().

→ Ссылка