что делает getchar в c
Посимвольный ввод и вывод. Понятие буфера
Функции putchar() и getchar()
Функция putchar() обычно принимает в качестве аргумента символ, либо символьную переменную и в результате своей работы выводит соответствующий символ на экран. Однако этой функции можно передать любое целое число, но, понятное дело, символа на экране вы можете не получить, если числу не соответствует ни один символ по таблице ASCII. Например:
Функции putchar() и printf() в определенном смысле взаимозаменяемы, так как, используя ту или другую, можно получить один и тот же результат. Хотя программный код будет выглядеть по-разному:
В результате выполнения этого кода на экране будут напечатаны два слова «Hello», разделенные переходом на новую строку. С putchar() это выглядит несколько сложнее. Как мы знаем, любая строка оканчивается нулевым по таблице ASCII символом, в данном случае этот символ служит сигналом для прекращения вывода на экран. Но если бы понадобилось вывести на экран строку, разделяя ее символы каким-нибудь другим символом (например, тире), то и в случае с printf() было бы не так все просто:
Поэтому выбор в пользу той или иной функции зависит от ситуации и ваших предпочтений.
В отличие от функции putchar() функция getchar() не имеет параметром. Когда getchar() выполняется, она считывает их потока ввода один символ и возвращает его в программу. Полученный таким образом символ может быть присвоен переменной, участвовать в выражениях или выводиться на экран с помощью функций вывода.
Если при выполнении этого кода ввести символ, то после нажатия Enter вы увидите два таких же символа на экране:
Прежде чем попытаться найти объяснение, изобразим «некорректного пользователя» и перед первым нажатием Enter введем несколько символов (больше двух). После Enter вы увидите три первых символа введенной вами строки, и программа завершиться. Хотя куда логичней было бы ожидать, что будет прочитан только первый символ, потом выведен на экран и потом запрошен следующий символ.
Такое странное на первый взгляд поведение программы связано не с языком C, а с особенностью работы операционных систем, в которых реализован буферный ввод-вывод. При операциях ввода-вывода выделяется область временной памяти (буфер), куда и помещаются поступающие символы. Как только поступает специальный сигнал (например, переход на новую строку при нажатии Enter), данные из буфера передаются по месту своего назначения (на экран, в переменную и др.).
Теперь, зная это, давайте посмотрим, что происходило в нашей программе, и сначала разберем второй случай с «некорректным пользователем», т.к. для понимания этот случай проще. Когда пользователь ввел первый символ, он попал в переменную a, далее сработала функция putchar(a) и символ попал в буфер. Т.к. Enter’а не было, то содержимое буфера на экране не было отображено. Пользователь ввел второй символ, переменная b получила свое значение, а putchar(b) отправила это значение в буфер. Аналогично с третьим символом. Как только пользователь нажал Enter, содержимое буфера было выведено на экран. Но символы, которые были выведены на экран, были выведены не программой, а операционной системой. Программа же выводила символы еще до того, как мы нажали Enter.
Почему же в первом случае при выполнении программы мы смогли ввести и увидеть на экране только два символа? Когда был введен первый символ, то он был присвоен переменной a и далее выведен в буфер. Затем был нажат Enter. Это сигнал для выброса данных их буфера, но это еще и символ перехода на новую строку. Этот символ ‘\n’, наверное, и был благополучно записан в переменную b. Тогда в буфере должен оказаться переход на новую строку, после этого введенный символ (уже помещенный в переменную c). После нажатия Enter мы должны были бы увидеть переход на новую строку от символа ‘\n’ и букву. Однако печатается только буква. Причина этого вероятно в том, что переход на новую строку не хранится в буфере.
Во многих учебниках по языку C приводится пример считывания символов, вводимых пользователем, и их вывод на экран:
В переменной a всегда хранится последний введенный символ, но перед тем как присвоить a новое значение с помощью функции putchar() старое значение сбрасывается в буфер. Как только поступает символ новой строки, работа программы прекращается, а также, поскольку была нажата клавиша Enter, происходит вывод содержимого буфер на экран. Если в условии цикла while будет не символ ‘\n’, а какой-нибудь другой, то программа будет продолжать обрабатывать символы, даже после нажатия Enter. В результате чего мы можем вводить и выводить множество строк текста.
Напишите программу посимвольного ввода-вывода, используя в качестве признака окончания ввода любой символ, кроме ‘\n’. Протестируйте ее.
При совместном использовании функций putchar() и getchar() обычно пользуются более коротким способом записи. Например:
Как быть, если требуется «прочитать» с клавиатуры или файла неизвестный текст, в котором может быть абсолютно любой символ? Как сообщить программе, что ввод окончен, и при этом не использовать ни один из возможных символов?
В операционных системах GNU/Linux можно передать функции getchar() значение EOF, если нажать комбинацию клавиш Ctrl + D, в Windows – Ctrl + Z.
Исправьте вашу программу таким образом, чтобы считывание потока символов прерывалось признаком EOF.
Решение задач
Здесь ввод символов может прекратиться не только при поступлении значения EOF, но и в случае, если массив заполнен ( i ). В цикле while проверяется условие, что числовой код очередного символа принадлежит диапазону [48, 57]. Именно в этом диапазоне кодируются цифры (0-9). Если поступивший символ является символом-цифрой, то он помещается в массив по индексу i, далее i увеличивается на 1, указывая на следующий элемент массива. После завершения цикла к массиву символов добавляется нулевой символ, т.к. по условию задачи должна быть получена строка (именно для этого символа ранее резервируется одна ячейка массива – N-1 ).
Урок 1. Часть 3: Инструкции языка Си scanf, gets, getchar — ввод данных
Функция языка Си gets
Ввод данных — это предоставление компьютеру информации, необходимой для работы программы. Вводимая информация присваивается переменным и хранится в памяти компьютера. В программе переменная используется в операциях и выражениях.
Функция Си gets() помещает в переменную вводимую строку. В качестве параметра функции указывается имя переменной, в которую и помещается строка.
var name:string; begin writeln(‘введите имя’); readln(name); writeln(name); end.
Функция языка Си getchar
Функция Си getchar() запрашивает с клавиатуры единичный символ и практически для всех компиляторов безразлично, к какому типу (char или int) относится данный символ.
Вызов функции getchar осуществляется другим способом. Параметра у нее нет, но указать круглые пустые скобки после имени функции надо обязательно. Вызов происходит как присваивание какой-то переменной значения функции. Т.е. слева указывается переменная и ей присваивается значение функции, указанной справа.
Для сравнения выполним ту же задачу с функцией Си gets():
Функция языка Си scanf
Функция Си scanf () является более многогранной функцией, так как позволяет вводить в компьютер данные любых типов.
По аналогии с функцией printf() функция Си scanf() тоже может иметь несколько аргументов, позволяя тем самым вводить значения числовых, символьных и строковых переменных в одно и то же время.
Список параметров функции scanf() состоит из двух частей: строки формата и списка данных. В строке формата находятся указатели формата (преобразователи символов, после знака процента), которые определяют то, каким образом должны быть интерпретированы вводимые данные. Вторая часть функции — список данных, в котором перечисляются переменные, в которые должны быть занесены вводимые значения. Порядок следования указателей формата и переменных должен быть одинаков.
Указатели формата аналогичны тем, которые используются функцией printf.
ВВОД И ВЫВОД ОДНОГО СИМВОЛА: ФУНКЦИИ getchar( ) И putchar( )
Функция getchar() получает один символ, поступающий с пульта терминала (и поэтому имеющий название), и передает его выполняющейся в данный момент программе. Функция putchar( ) получает один символ, поступающий из программы, и пересылает его для вывода на экран. Ниже приводится пример очень простой программы. Единственное, что она делает, это принимает один символ с клавиатуры и выводит его на экран. Мы будем постепенно модифицировать данную программу до тех пор, пока она не приобретет ряд полезных возможностей. Из дальнейшего вы узнаете, что представляют из себя эти возможности, но сначала давайте посмотрим на наш скромный первый вариант
ch = getchar( ); /* строка 1 */
putchar (ch); /* строка 2 */
Для большинства систем спецификации функций getchar и putchar содержатся в системном файле stdio.h, и только по этой причине мы указали данный файл в программе. Использование такой программы приводит к следующему:
Обозначение [ввод] служит указанием, что вы должны нажать клавишу [ввод]. В любом случае, первый символ g вы набираете на клавиатуре сами, а второй выводится компьютером.
Результат зависит от того, есть в вашей системе «буферизованный» ввод или нет. Если перед тем как получить на экране ответ, вы должны нажать клавишу [ввод], то буферизация в вашей системе имеется. Давайте закончим рассмотрение функций getchar( ) и putchar( ) перед тем, как приступить к обсуждению понятия буферов.
Функция getchar( ) аргументов не имеет (т. е. при ее вызове в круглые скобки не помещается никакая величина). Она просто получает очередной поступающий символ и сама возвращает его значение выполняемой программе. Например, если указанная функция получает букву Q, ее значением в данный момент будет эта буква. Оператор, приведенный в строке 1, присваивает значение функции getchar( ) переменной ch.
Функция putchar( ) имеет один аргумент. При ее вызове необходимо в скобках указать символ, который требуется вывести на печать. Аргументом может быть одиночный символ (включая знаки представляемые управляющими последовательностями, описанными в гл. 3), переменная или функция, значением которой является одиночный символ. Правильным обращением к функции putchar( ) является указание любого из этих аргументов при ее вызове.
putchar (‘S’); /* напомним, что символьные */
putchar (‘\n’); /* константы заключаются в апострофы */
Форму записи, приведенную в последнем примере, мы можем использовать для того, чтобы представить нашу программу в следующем виде:
Такая запись очень компактна и не требует введения вспомогательных переменных. Кроме того, в результате компиляции такая программа оказывается более эффективной, но, пожалуй, менее понятной.
После того как мы ознакомились с работой этих двух функций, можно перейти к обсуждению понятия буферов.
В чем разница между getch() и getchar()?
какова точная разница между getch и getchar функции?
4 ответов
getch() нестандартная. Он получает символ с клавиатуры (который может отличаться от stdin) и не повторяет его.
getch() и getche() старые функции MS-DOS, объявленные в и по-прежнему популярны в системах Windows. Они не являются стандартными функциями C; они делают не существует во всех системах. getch считывает одно нажатие клавиши с клавиатуры немедленно, не дожидаясь, пока пользователь нажмет клавишу возврата, и без эха нажатия клавиши. getche это то же самое, за исключением того, что он тут Эхо. Насколько мне известно, getch и getche всегда чтение с клавиатуры; на них не влияет перенаправление ввода.
и ответ getchar не имеет никакого контроля над деталями, такими как эхо и буферизация ввода-насколько это касается C, они ниже уровня, зависят от системы проблемы.
но полезно понять основную модель ввода, которая getchar предполагает. Смущающе, как правило,два различные уровни буферизации.
пакет stdio считывает символы из операционной системы в свой собственный входной буфер. getchar просто извлекает следующий символ из буфера. Когда буфер пуст, пакет stdio пытается пополнить его, прочитав больше символов из операционной система.
но во всем этом, как видите, getchar и пакет stdio не имеет контроля над деталями, такими как эхо или редактирование входной строки, потому что они обрабатываются ранее, на более низком уровне, в драйвере терминала, на шаге 1.
так, по крайней мере в Unix-подобных операционных систем, если вы хотите прочитать символ, не дожидаясь Клавиша возврата или контроль того, повторяются ли символы или нет, вы делаете это, регулируя поведение драйвера терминала. Детали различаются, но есть способ включить и выключить echo, а также способ (на самом деле несколько способов) включить и выключить редактирование входной строки. (По крайней мере некоторые из этих деталей, см. это так вопрос или вопрос 19.1 старого C FAQ список.)
getchar, getwchar
Reads a character from standard input.
Syntax
Return Value
Returns the character read. These functions wait for input and don’t return until input is available.
To indicate a read error or end-of-file condition, getchar returns EOF, and getwchar returns WEOF. For getchar, use ferror or feof to check for an error or for end of file.
Remarks
Each routine reads a single character from stdin and increments the associated file pointer to point to the next character. getchar is the same as _fgetchar, but it’s implemented as a function and as a macro.
These functions also lock the calling thread and are thread-safe. For a non-locking version, see _getchar_nolock, _getwchar_nolock.
By default, this function’s global state is scoped to the application. To change this, see Global state in the CRT.
Generic-Text Routine Mappings
TCHAR.H routine | _UNICODE & _MBCS not defined | _MBCS defined | _UNICODE defined |
---|---|---|---|
_gettchar | getchar | getchar | getwchar |
Requirements
Routine | Required header |
---|---|
getchar | |
getwchar | or |
The console isn’t supported in Universal Windows Platform (UWP) apps. The standard stream handles that are associated with the console, stdin, stdout, and stderr, must be redirected before C run-time functions can use them in UWP apps. For additional compatibility information, see Compatibility.