Getchar си что это - IT Новости из мира ПК
Remkomplekty.ru

IT Новости из мира ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Getchar си что это

Посимвольный ввод и вывод. Понятие буфера

Функции putchar() и getchar()

В заголовочном файле stdio.h содержится объявление не только функции printf() , но и многих других, связанных с вводом-выводом. Среди них есть функции, которые обрабатывают по одному символу за вызов — putchar() и getchar() .

Функция putchar() обычно принимает в качестве аргумента символ, либо символьную переменную и в результате своей работы выводит соответствующий символ на экран. Однако этой функции можно передать любое целое число, но, понятное дело, символа на экране вы можете не получить, если числу не соответствует ни один символ по таблице ASCII. Например:

Функции putchar() и printf() в определенном смысле взаимозаменяемы, т.к., используя ту или другую, можно получить один и тот же результат. Хотя программный код будет выглядеть по-разному:

В результате выполнения этого кода на экране будут напечатаны два слова «Hello», разделенные переходом на новую строку. С putchar() это выглядит несколько сложнее. Как мы знаем, любая строка оканчивается нулевым по таблице ASCII символом, в данном случае этот символ служит сигналом для прекращения вывода на экран. Но если бы понадобилось вывести на экран строку, разделяя ее символы каким-нибудь другим символом (например, тире), то и в случае с printf() было бы не так все просто:

Поэтому выбор в пользу той или иной функции зависит от ситуации и ваших предпочтений.

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

Если при выполнении этого кода ввести символ, то после нажатия Enter вы увидите два таких же символа на экране:

Первый — результат выполнения функции printf() , второй — putchar() . Если вы перед нажатием Enter введете несколько символов, то прочитан будет только первый, остальные будут проигнорированы. Посмотрите вот на этот код:

Как вы думает, как он будет выполняться? По идее после ввода символа, он должен сразу отображаться на экране функцией putchar() и запрашиваться следующий символ, потому что далее идет снова вызов getchar() . Если вы как корректный пользователь программы сначала введете первый символ и нажмете Enter, то символ отобразиться на экране. Потом вы введете второй символ и после 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() обычно пользуются более коротким способом записи. Например:

Задание

  1. Объясните, почему сокращенный вариант записи посимвольного ввода-вывода работает правильно. Для этого опишите последовательность операций в условии цикла while .
  2. Перепишите вашу программу на более короткий вариант.

Как быть, если требуется «прочитать» с клавиатуры или файла неизвестный текст, в котором может быть абсолютно любой символ? Как сообщить программе, что ввод окончен, и при этом не использовать ни один из возможных символов?

В операционных системах и языках программирования вводят специальное значение, которое служит признаком окончания потока ввода или признаком конца файла. Называется это значение EOF (end of file), а его конкретное значение может быть разным, но чаще всего это число -1. EOF представляет собой константу, в программном коде обычно используется именно имя (идентификатор) константы, а не число -1. EOF определена в файле stdio.h.

В операционных системах GNU/Linux можно передать функции getchar() значение EOF, если нажать комбинацию клавиш Ctrl + D, в Windows – Ctrl + Z.

Задание
Исправьте вашу программу таким образом, чтобы считывание потока символов прерывалось признаком EOF.

Решение задач

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

Здесь ввод символов может прекратиться не только при поступлении значения EOF, но и в случае, если массив заполнен ( i ). В цикле while проверяется условие, что числовой код очередного символа принадлежит диапазону [48, 57]. Именно в этом диапазоне кодируются цифры (0-9). Если поступивший символ является символом-цифрой, то он помещается в массив по индексу i, далее i увеличивается на 1, указывая на следующий элемент массива. После завершения цикла к массиву символов добавляется нулевой символ, т.к. по условию задачи должна быть получена строка (именно для этого символа ранее резервируется одна ячейка массива – N-1 ).

Задание

  1. Напишите программу, которая считает количество введенных пользователем символов и строк.
  2. Напишите программу, которая подсчитывает количество слов в строке.

лабы по информатике, егэ

лабораторные работы и задачи по программированию и информатике, егэ по информатике

Урок 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() , которая отображает символ на экране. Первая из этих функций ожидает, пока не будет нажата клавиша, а затем возвращает значение этой клавиши. Кроме того, при нажатии клавиши на клавиатуре на экране дисплея автоматически отображается соответствующий символ. Вторая же функция, putchar() , отображает символ на экране в текущей позиции курсора. Вот прототипы функций getchar() и putchar() :

Как видно из прототипа, считается, что функция getchar() возвращает целый результат. Однако возвращаемое значение можно присвоить переменной типа char , что обычно и делается, так как символ содержится в младшем байте. (Старший байт при этом обычно обнулен.) В случае ошибки getchar() возвращает EOF . (Макрос EOF определяется в и часто равен -1.)

Что же касается putchar() , то несмотря на то, что эта функция объявлена как принимающая целый параметр, она обычно вызывается с символьным аргументом. На самом деле из ее аргумента на экран выводится только младший байт. Функция putchar() возвращает записанный символ или, в случае ошибки, EOF .

В следующей программе продемонстрировано применение getchar() и putchar() . В этой программе с клавиатуры вводятся символы, а затем они отображаются на другом регистре. То есть символы, вводимые на верхнем регистре, выводятся на нижнем, а вводимые на нижнем — выводятся на верхнем. Чтобы остановить программу, введите точку.

Читать еще:  Стандартные модули паскаль

(Эта программа не работает, правда, с кириллическими символами.)

Трудности использования getchar()

Использование getchar() может быть связано с определенными трудностями. Во многих библиотеках компиляторов эта функция реализуется таким образом, что она заполняет буфер ввода до тех пор, пока не будет нажата клавиша . Это называется построчно буферизованным вводом. Чтобы функция getchar() возвратила какой-либо символ, необходимо нажать клавишу . Кроме того, эта функция при каждом ее вызове вводит только по одному символу. Поэтому сохранение в буфере целой строки может привести к тому, что в очереди на ввод останутся ждать один или несколько символов, а в интерактивной среде это раздражает достаточно сильно. Хотя getchar() и можно использовать в качестве интерактивной функции, но это делается редко. Так что если предшествующая программа ведет себя не так, как ожидалось, то вы теперь знаете, в чем тут дело.

Альтернативы getchar()

Так как getchar() , имеющаяся в библиотеке компилятора, может оказаться неподходящей в интерактивной среде, то для чтения символов с клавиатуры может потребоваться другая функция. В стандарте языка С не определяется никаких функций, которые гарантировали бы интерактивный ввод, но их определения имеются буквально в библиотеках всех компиляторов С. И пусть в стандарте С эти функции не определены, но известны они всем! А известны они благодаря функции getchar() , которая для большинства программистов явно не подходит.

У двух из самых распространенных альтернативных функций getch() и getche() имеются следующие прототипы:

В библиотеках большинства компиляторов прототипы таких функций находятся в заголовочном файле . В библиотеках некоторых компиляторов имена этих функций начинаются со знака подчеркивания (_). Например, в Visual C++ компании Microsoft они называются _getch() и _getche() .

Функция getch() ожидает нажатия клавиши, после которого она немедленно возвращает значение. Причем, символ, введенный с клавиатуры, на экране не отображается. Имеется еще и функция getche() , которая хоть и такая же, как getch() , но символ на экране отображает. И если в интерактивной программе необходимо прочитать символ с клавиатуры, то часто вместо getchar() применяется getche() или getch() . Вот, например, предыдущая программа, в которой getchar() заменена функцией getch() :

Когда выполняется эта версия программы, при каждом нажатии клавиши соответствующий символ сразу передается программе и выводится на другом регистре. А ввод в строках не буферизируется. И хотя в кодах в этой книге функции getch() и getche() больше не встречаются, но они вполне могут пригодиться в тех программах, которые напишете вы.

Getchar си что это

Функция getchar за одно обращение к ней выдает в качестве результата один символ, поступивший с системного ввода. Мы можем рассматривать getchar как функцию, имеющую заголовок

int getchar()

видите, у нее совсем нет аргументов и она возращает значение типа — это значение символа во внутреннем представлении его для данной ЭВМ(напрмер в ACSII). Таким образом после обращения

c = getchar()

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

Функция putchar за одно обращение к ней выдает один символ в стандарный выходной поток. Вызов этой функции имеет вид:

putchar(c);

c— переменная символьного типа, котрой предварительно было присвоено некоторое значение. Рассмотрим примеры. Программа (пример 2.7) вывводит на экран все прописные латинские буквы. Мы уже напоминали что типы char и int взаимозаменяемы. Последовательное прибавление к очередному значению с обеспечивает выбор очередной буквы ввиду их лексической упорядоченности.

Прежде, чем перейти к рассмотрению примеров, обсудим, как машина должна определять конец входного потока символов, вводимых с клавиатуры терминала. Можно, конечно, выбрать некоторый символ как признак конца потока, но нужна гарантия, что он нигде не повторится. В использованной нами операционной системе для получения такого символа надо нажать CTRL+Z. В программе значение этого символа мы будем использовать через символическое имя EOF(end of file). Теперь мы можем написать программы копирования файла(прмер 2.8) . Пока не обнаружен конец входного потока, ЭВМ получает с клавиатуры символ (это делает функция getchar) и сразу же выодит его на экран дисплея с помощью функции putchar. Для завершения программы достаточно нажать CTRL+Z.

Программу копирования можно написать и более компактно. В языке Си любое присваивание например, c=getchar(), можно использовать в любом выражении в качестве операнда; его значение — это просто значение, присваиваемое левой части. Учитывая сказанное, перепишем Эхо Программу (Пример 2.9) . Это компактная, элегантная программа принимает символ с клавиатуры и присваивает его переменной с, а затем сравнивает его с признаком конца файла. Пока этот признак не обнаружен, выполняется тело цикла и символ выдается на экран. В противном случае цикл, а вместе с ним и вся программа завершаются.

Отметим, что включение присваиваний в проверки — силбное единство языка, способствующее созданию программ. Учтите, что скобки вокруг присваивания внутри условия необходимы: приоритет операции != выше приоритета операции присваивания.
Следующяя программа (пример 3.0) подсчитывает количество строк, слов и символов во введенном с клавиатуры тексте. Слово — любая последовательность символов, не содержащяя знаков табуляции («t»), пробелов и символов «n». Будем предполагать также, что любая строка, в том числе и последняя, завершается символом перехода на новую строку «n». Обратите внимание на строку line= word=kc=0; в которой трем переменным приваивается значение нуля. Выражения, связанные логическими операциями &&(И) и || (ИЛИ) вычисляются слева на право. Как только истинность или ложность станет известной, дальнейшие вычисления прекращяются Таким образом в строке if(s==’ ‘ || s==’n’ || s==’t’)
символ s содержит пробел, то остальные две проверки уже не делаются. Отсюда следует выжный для практики вывод: первыми надо проверять наиболее часто встречающиеся символы.

Читать еще:  Указатели и динамические структуры данных паскаль

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

какова точная разница между getch и getchar функции?

4 ответов

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

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

стандартная функция C является getchar() , объявленное в . Она существовала с незапамятных времен. Он считывает один символ из стандартного ввода ( stdin ), который обычно является клавиатурой пользователя, если он не был перенаправлен (например, через символ перенаправления ввода оболочки , или трубы).

getch() и getche() старые функции MS-DOS, объявленные в и по-прежнему популярны в системах 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.)

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×