В чем разница между getch() и getchar()?
какова точная разница между getch
и getchar
функции?
4 ответов
getchar()
- стандартная функция, которая получает символ из stdin.
getch()
нестандартная. Он получает символ с клавиатуры (который может отличаться от stdin) и не повторяет его.
стандартная функция C является getchar()
, объявленное в <stdio.h>
. Она существовала с незапамятных времен. Он считывает один символ из стандартного ввода (stdin
), который обычно является клавиатурой пользователя, если он не был перенаправлен (например, через символ перенаправления ввода оболочки <
, или трубы).
getch()
и getche()
старые функции MS-DOS, объявленные в <conio.h>
и по-прежнему популярны в системах Windows. Они не являются стандартными функциями C; они делают не существует во всех системах. getch
считывает одно нажатие клавиши с клавиатуры немедленно, не дожидаясь, пока пользователь нажмет клавишу возврата, и без эха нажатия клавиши. getche
это то же самое, за исключением того, что он тут Эхо. Насколько мне известно, getch
и getche
всегда чтение с клавиатуры; на них не влияет перенаправление ввода.
естественно, возникает вопрос, если getchar
стандартная функция, как вы используете ее для чтения одного символ, не дожидаясь ключа возврата,или без эха? И ответы на эти вопросы, по крайней мере, немного сложнее. (На самом деле, они достаточно сложны, что я подозреваю, что они объясняют постоянную популярность getch
и getche
, которые, если ничего больше не очень просты в использовании.)
и ответ getchar
не имеет никакого контроля над деталями, такими как эхо и буферизация ввода-насколько это касается C, они ниже уровня, зависят от системы проблемы.
но полезно понять основную модель ввода, которая getchar
предполагает. Смущающе, как правило,два различные уровни буферизации.
когда пользователь вводит клавиши на клавиатуре, они считываются драйвер терминала. Как правило, в режиме по умолчанию драйвер терминала повторяет нажатия клавиш сразу после их ввода (чтобы пользователь мог видеть, что они вводят). Обычно в режиме по умолчанию драйвер терминала также поддерживает некоторое редактирование строк - например, пользователь может нажать клавишу Delete или Backspace, чтобы удалить случайно введенный символ. Для поддержки редактирования строк драйвер терминала обычно собирает символы в входной буфер. Только когда пользователь нажимает Return, содержимое этого буфера становится доступным вызывающей программе. (Этот уровень буферизации присутствует, только если стандартный вход находится в то клавиатура или другие устройства. Если стандартный ввод перенаправлен в файл или канал, драйвер терминала не действует и этот уровень буферизации не применяется.)
пакет stdio считывает символы из операционной системы в свой собственный входной буфер.
getchar
просто извлекает следующий символ из буфера. Когда буфер пуст, пакет stdio пытается пополнить его, прочитав больше символов из операционной система.
Итак, если мы проследим, что происходит, начиная с вызова программы getchar
впервые: stdio обнаруживает, что его входной буфер пуст, поэтому он пытается прочитать некоторые символы из операционной системы, но пока нет доступных символов, поэтому read
блоки вызова. Между тем, пользователь может вводить некоторые символы, которые накапливаются во входном буфере драйвера терминала, но пользователь не отвечает. Наконец, пользователь попадает Вернитесь, и заблокировано read
вызов возвращается, возвращая всю строку символов в stdio
, который использует их для заполнения своего входного буфера, из которого он затем возвращает первый в этот начальный вызов getchar
, который терпеливо ждал все это время. (А затем, если программа вызывает getchar
второй или третий раз, там наверное are еще несколько символов -- следующие символы в строке, введенной пользователем -- доступны во входном буфере stdio для getchar
немедленно вернуться. Подробнее об этом см. 6.2 из этих C курс Примечания.)
но во всем этом, как видите,getchar
и пакет stdio не имеет контроля над деталями, такими как эхо или редактирование входной строки, потому что они обрабатываются ранее, на более низком уровне, в драйвере терминала, на шаге 1.
так, по крайней мере в Unix-подобных операционных систем, если вы хотите прочитать символ, не дожидаясь Клавиша возврата или контроль того, повторяются ли символы или нет, вы делаете это, регулируя поведение драйвера терминала. Детали различаются, но есть способ включить и выключить echo, а также способ (на самом деле несколько способов) включить и выключить редактирование входной строки. (По крайней мере некоторые из этих деталей, см. это так вопрос или вопрос 19.1 старого C FAQ список.)
при выключенном редактировании строки ввода операционная система может возвращать символы сразу (не дожидаясь ключа возврата), потому что в этом случае не нужно беспокоиться о том, что пользователь мог ввести неправильное нажатие клавиши, которое нужно "вернуть" с помощью клавиши Delete или Backspace. (Но точно так же, когда программа отключает редактирование входной строки в драйвере терминала, если она хочет, чтобы пользователь исправлял ошибки, она должна реализовать свое собственное редактирование, потому что она увидит --- то есть последовательные вызовы getchar
вернутся -- как неправильный символ(ы) пользователя и код символа для клавиши Delete или Backspace.)
getch()
Он просто получает вход, но никогда не отображает это как выход на экране, несмотря на то, что мы нажимаем клавишу enter.
getchar()
он получает вход и отображает его на экране, когда мы нажимаем клавишу enter.
getchar
является стандартным C, найденным в stdio.h. Он читает один символ изstdin
(стандартный входной поток = консольный вход в большинстве систем). Это блокирующий вызов, так как он требует от пользователя ввести символ, а затем нажмите enter. Он вторит вводу пользователя на экран.getc(stdin)
на 100% эквивалентноgetchar
, кроме его также можно использовать для других входных потоки.getch
является нестандартным, обычно встречается в старом устаревшем заголовке MS DOS conio.ч. Он работает так же, какgetchar
за исключением того, что он не блокируется после первого нажатия клавиши, он позволяет программе продолжать работу без нажатия пользователем enter. Это не Эхо ввода на экран.getche
это то же самое, чтоgetch
, и нестандартные, но ее отголоски вход экран.