Цикл getchar() не заканчивается без причины

У меня есть этот фрагмент кода:

char key[32];
for (int i = 0; i < 32; i++)
{
    key[i] = getchar();
}

который, очевидно, должен принять 32 персонажи, а затем остановиться.

Проблема в том, что это не останавливается на i = 32 и продолжается вечно до тех пор, пока (по неизвестной причине) я не нажму клавишу ввода.

Не могли бы вы объяснить, почему это происходит?

1 ответ

Решение

продолжается вечно до тех пор, пока (по неизвестной причине) я не нажму клавишу ввода.

Да, это нормально. Смотрите, например, http://c-faq.com/osdep/cbreak.html:

Ввод в компьютерную программу обычно проходит несколько этапов. На самом низком уровне зависимые от устройства подпрограммы в операционной системе обрабатывают детали взаимодействия с конкретными устройствами, такими как клавиатуры, последовательные линии, дисководы и т. Д. Кроме того, современные операционные системы, как правило, имеют независимый от устройства уровень ввода-вывода., унифицируя доступ к любому файлу или устройству. Наконец, C-программа обычно изолируется от средств ввода-вывода операционной системы переносимыми функциями библиотеки stdio.

На некотором уровне интерактивный ввод с клавиатуры обычно собирается и представляется запрашивающей программе по одной строке за раз. Это дает операционной системе возможность согласованно редактировать строки ввода (backspace/delete/rubout и т. Д.), Не требуя его встраивания в каждую программу. Только когда пользователь удовлетворен и нажимает клавишу RETURN (или эквивалентную), линия становится доступной для вызывающей программы. Даже если вызывающая программа, кажется, читает, введите символ за раз (с getchar или тому подобное), первый вызов блокируется до тех пор, пока пользователь не наберет целую строку, после чего потенциально становится доступным много символов и много запросов символов (например, getchar звонки) выполняются в быстрой последовательности.

Другие вопросы по тегам