В чем разница между getch() и getchar()? - программирование
Подтвердить что ты не робот

В чем разница между getch() и getchar()?

Какая разница между getch и getchar?

4b9b3361

Ответ 1

getchar() - стандартная функция, которая получает символ из stdin.

getch() является нестандартным. Он получает символ с клавиатуры (который может отличаться от stdin) и не отвечает на него.

Ответ 2

Стандартная функция C - это getchar(), объявленная в <stdio.h>. Он существовал в основном с самого начала. Она считывает один символ из стандартного ввода (stdin), который, как правило, пользователь клавиатуры, если только он не был перенаправлен (например, с помощью перенаправления ввода оболочки символа < или трубы).

getch() и getche() являются старыми функциями MS-DOS, объявленными в <conio.h> и по-прежнему популярными в системах Windows. Они не являются стандартными функциями C; они не существуют во всех системах. getch считывает одно нажатие клавиши с клавиатуры, не дожидаясь, пока пользователь нажмет клавишу "Возврат", и не будет эхом нажатия клавиши. getche - это то же самое, за исключением того, что он выполняет эхо. Насколько я знаю, getch и getche всегда читаются с клавиатуры; они не зависят от перенаправления ввода.

Естественно возникает вопрос: если getchar - стандартная функция, как вы используете его для чтения одного символа, не дожидаясь ключа Return или без эха? И ответы на эти вопросы, по крайней мере, немного сложны. (На самом деле они достаточно сложны, и я подозреваю, что они объясняют постоянную популярность getch и getche, которые, если ничего другого не очень легко использовать.)

И ответ заключается в том, что getchar не имеет контроля над такими деталями, как эхо и буферизация ввода - насколько это касается C, это проблемы с более низким уровнем, зависящие от системы.

Но полезно понять базовую модель ввода, которую предполагает getchar. Смутно, обычно существует два разных уровня буферизации.

  1. Когда пользователь набирает ключи на клавиатуре, они считываются драйвером терминала операционной системы. Как правило, в режиме по умолчанию драйвер терминала мгновенно выдает нажатия клавиш при их вводе (поэтому пользователь может видеть, что они набирают). Как правило, в режиме по умолчанию драйвер терминала также поддерживает некоторое редактирование строк - например, пользователь может нажать клавишу "Удалить" или "Назад", чтобы удалить случайно записанный символ. Чтобы поддерживать редактирование строк, драйвер терминала обычно собирает символы во входном буфере. Только когда пользователь нажимает Return, это содержимое этого буфера, доступное для вызывающей программы. (Этот уровень буферизации присутствует только в том случае, если стандартный ввод на самом деле является клавиатурой или другим последовательным устройством. Если стандартный ввод был перенаправлен на файл или канал, драйвер терминала не действует, и этот уровень буферизации не применяется.)

  2. Пакет stdio считывает символы из операционной системы в свой собственный входной буфер. getchar просто извлекает следующий символ из этого буфера. Когда буфер пуст, пакет stdio пытается пополнить его, прочитав больше символов из операционной системы.

Итак, если мы проследим, что происходит, начиная с того, когда программа вызывает getchar в первый раз: stdio обнаруживает, что его входной буфер пуст, поэтому он пытается прочитать некоторые символы из операционной системы, но пока нет каких-либо символов, поэтому блокировки read. Между тем пользователь может вводить несколько символов, которые накапливаются в буфере ввода драйвера терминала, но пользователь еще не нажал Return. Наконец, пользователь нажимает Return, а заблокированный вызов read возвращается, возвращая целую строку символов в stdio, которая использует их для заполнения входного буфера, из которого она возвращает первый из них в этот начальный вызов getchar, который терпеливо ждал все это время. (И тогда, если программа вызывает getchar второй или третий раз, возможно, есть еще несколько символов - следующие символы в строке, введенной пользователем - доступный в буфере ввода stdio для возврата getchar немедленно., см. раздел 6.2 этих заметок курса C).

Но во всем этом, как вы можете видеть, getchar и пакет stdio не имеют контроля над такими деталями, как эхо или редактирование строк ввода, потому что они обрабатываются ранее на более низком уровне в драйвере терминала на шаге 1.

Таким образом, по крайней мере, в Unix-подобных операционных системах, если вы хотите прочитать символ, не дожидаясь ключа Return, или контролировать, являются ли символы эхом или нет, вы делаете это, настраивая поведение драйвера терминала. Детали меняются, но есть способ включить и выключить эхо и способ (на самом деле несколько способов) включить и отключить редактирование ввода строки. (По крайней мере, некоторые из этих деталей см. В этом вопросе SO или вопрос 19.1 в старом списке часто задаваемых вопросов.)

Когда редактирование строки ввода отключено, операционная система может немедленно возвращать символы (не дожидаясь клавиши Return), потому что в этом случае не нужно беспокоиться о том, что пользователь мог ввести неверное нажатие клавиши, которое должно быть "принято" назад "с помощью клавиши Delete или Backspace. (Но тем не менее, когда программа отключает редактирование строки ввода в драйвере терминала, если она хочет, чтобы пользователь исправлял ошибки, он должен реализовать свое собственное редактирование, потому что он увидит --- то есть, последовательный вызовы getchar возвращаются - как неправильный символ пользователя, так и код символа для клавиши Delete или Backspace.)

Ответ 3

getch() он просто получает ввод, но никогда не отображает его как выход на экране, несмотря на то, что мы нажимаем клавишу ввода.

getchar() он получает вход и отображает его на экране, когда мы нажимаем клавишу ввода.

Ответ 4

  • getchar является стандартным C, найденным в stdio.h. Он считывает один символ из stdin (стандартный входной поток = консольный ввод в большинстве систем). Это блокирующий вызов, так как он требует, чтобы пользователь набрал символ, а затем нажмите клавишу ввода. Он перекликается с пользовательским вводом на экран.

  • getc(stdin) на 100% эквивалентен getchar, за исключением того, что он также может использоваться для других входных потоков.

  • getch является нестандартным, обычно встречающимся в старом устаревшем заголовке MS DOS conio.h. Он работает так же, как и getchar за исключением того, что он не блокируется после первого нажатия клавиши, он позволяет программе продолжать работу без нажатия на пользователя. Он не выводит входные данные на экран.

  • getche - это то же самое, что и getch, также нестандартное, но оно выводит сигнал на экран.