Различия между функциями getc, getchar, getch, getche |
![]() |
Добавил(а) microsin |
Все эти функции читают символ из системы ввода (например консоль терминала) и возвращают соответствующее им целочисленное значение. Возвращаемое значение может быть специальным для индикации ошибки. Значение EOF также является специальным, используемым для той же цели. getc. Читает один символ из потока ввода и в случае успеха возвратит соответствующее целочисленное значение (обычно значение кода символа ASCII). В случае ошибки будет возвращен символ EOF. Функция getc блокирующая, т. е. из неё не будет произведен возврат, пока из потока ввода stream не поступит символ. Синтаксис: int getc(FILE *stream); В следующем примере показано чтение из стандартного ввода (клавиатура). В этом случае возврат из getc не произойдет, пока не будет нажата клавиша Enter. На выходе будет возвращен первый введенный символ, остальные, которые нажаты до Enter, будут потеряны. Нажатие Ctrl+C прервет работу функции. #include < stdio.h> Результат выполнения: Ввод: g (и нажатие на Enter) Нажатие Ctrl+C прервет работу программы, при этом функция не успеет возвратить значение, чтобы оно было выведено оператором printf. getchar. Отличия между getc() и getchar() в том, что getc() может прочитать символ из любого потока ввода, но getchar() читает символ только из стандартного ввода. Таким образом, для консольного приложения в контексте клавиатурного ввода getchar() является эквивалентом getc(stdin). Синтаксис: int getchar(void); Пример использования на C: #include < stdio.h> Результат работы: Ввод: g (и нажатие на Enter) Очевидно, что этот пример с вызовом getchar() работает так же, как и предыдущий с вызовом getc(stdin). getch. Как и предыдущая getchar(), функция getch() также считывает символ из клавиатуры. Однако она не использует никакой буфер, так что введенный символ не отобразится на экране, и будет немедленно возвращен без ожидания нажатия на клавишу Enter. Синтаксис: int getch(); Функция getch() не относится к стандартным функциям ввода/вывода (описанным в stdio.h), и её определение находится в заголовке conio.h. Этот заголовочный файл в основном используется в компиляторах MS-DOS, такими как Turbo C. Он не является частью стандартной библиотеки C или ISO C, и не определен стандартом POSIX. Таким образом, следующий пример не может быть скомпилирован в Linux. Чтобы добиться поведения консоли, аналогичного функции getch, необходимо поменять режим работы терминала с помощью вызовов tcgetattr(), tcsetattr() (см. далее). Пример использования на C: #include < conio.h> Результат выполнения: Ввод: g (без клавиши Enter) getche. Функция getche() прочитает один символ из клавиатуры и отобразит его немедленно на экране вывода без ожидания клавиши Enter. Как и функция getch(), она также является нестандартной, и присутствует в заголовке conio.h. Синтаксис: int getche(void); Пример программы на C: #include < conio.h> Результат работы: Ввод: g (без клавиши Enter) [Аналог функции getch() в Linux] Ниже приведен код функций disable_console_canonical() и restore_console_settings(). Первая из них установит режим консоли таким образом, что функция getchar() будет работать аналогично функции getch(), т. е. будет сразу делать возврат введенного символа без ожидания клавиши Enter. Вторая функция, restore_console_settings(), восстановит предыдущие настройки консоли. #include < stdlib.h> void restore_console_settings (void) { tcsetattr(0, TCSANOW, &stored_settings); return; } Подробно про использование этих функций см. [2]. [Ссылки] 1. Difference between getc(), getchar(), getch() and getche() site:geeksforgeeks.org. |