Getchar в c что это за программа

При запуске программы на Си автоматически открываются ряд потоков, основными из которых являются следующие:

  • Стандартный поток ввода stdin
  • Стандартный поток вывода stdout
  • Стандартный поток вывода сообщений об ошибках stderr

Стандартный поток ввода stdin по умолчанию соответствует клавиатуре, а потоки stdout и stderr — экрану монитора.

Для управления вводом-выводом с помощью этих потоков используются ряд функций:

  • getchar() : ввод с клавиатуры одного символа
  • putchar() : вывод на консоль одного символа
  • fgets() : ввод одной строки
  • puts() / fputs() : вывод одной строки на консоль
  • scanf() : ввод с консоли с форматированием данных
  • sscanf() : ввод с из строки с форматированием данных
  • printf() : вывод с форматированием данных

Функции printf и scanf уже рассматривались ранее, поэтому посмотрим, как применять остальные функции.

Ввод и вывод символов

Для ввода и вывода символа применяются функции getchar() и putchar() . Но следует сказать, что на самом деле они полноценными функциями не являются, а определены как макросы в заголовочном файле stdio.h :

#7. Стандартные потоки ввода/вывода. Функции putchar() и getchar() | Язык C для начинающих


#define getchar() getc(stdin) #define putchar(c) putc((c), stdout)

Вывод символа

Для вывода отдельного символа на консоль предназначена функция putchar() со следующим прототипом:

int putchar(int c);

Выводимый символ в виде числового кода передается в putchar в качестве параметра, он же возвращается функцией.

#include int main(void) < char c = ‘A’; putchar(c); // Выводим символ A >

Ввод символа

Для ввода одного символа с клавиатуры применяется функция getchar() , которая имеет следующий прототип:

int getchar(void);

В качестве результата функция возвращает числовой код введенного символа.

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

И если буфер операционной системы не пуст, то при вызове функции getc() она получает очередной символ из буфера. Если же буфер пуст, то происходит чтение байта из потока ввода с помощью системной функции, название которой зависит от операционной системы.

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

#include int main(void) < printf(«1»); getchar(); // ожидание ввода символа printf(«2»); getchar(); // ожидание ввода символа printf(«3»); return 0; >

Сначала на экран выводится цифра 1, после чего функция getchar ожидает ввода символа. Если после ввода символа мы нажмем Enter, то в буфер будет помещены два числовых кода — введеного символа и клавиши Enter. Поэтому при втором вызове getchar эта функция считывает байт из буфера — то есть числовой код клавиши Enter.

Функция getchar в языке Си (полное объяснение)

Например, введем при первом вызове функции getchar символ «a», а затем Enter:

1a 23

Но если при каждом вызове getchar мы будем только нажимать клавишу Enter, тогда в буфер будет заноситься только код этой клавиши, и соответственно программа будет работать, как и ожидалось:

1 2 3

Применим функции getchar и putchar для ввода и вывода символов с клавиатуры:

#include int main(void) < int c; while((c=getchar())!=EOF) < putchar(c); >return 0; >

Читайте также:
Java 7 что за программа

Функция getchar() считывает числовой код символа, который потом выводится в функции putchar() . Для вывода из программы необходимо ввести комбинацию клавиш Ctrl+C.

Ввод и вывод строк

Вывод строк и puts

Для вывода одной строки на консоль предназначена функция puts() со следующим прототипом:

int putchar(char *s);

В качестве параметра передается указатель на строку, а возвращаемым результатом функции является последний выведенный символ.

При этом функция puts() будет выводить символы переданной строки, пока не дойдет до нулевого символа ‘’. Если же выводимый массив символов не содержит этого символа, то результат программы неопределен. Например:

#include int main(void) < puts(«Hello World»); // выводим строковый литерал char* name = «Hello Metanit.com»; puts(name); // выводим значение переменной return 0; >
Hello World Hello Metanit.com

Вывод строк и fputs

Функция fputs() также записывает в поток вывода строку, то есть набор символов, который завершается символом ‘’. При записи строки нулевой символ ‘’ не записывается. Она имеет следующий прототип:

int fputs(const char *s, FILE *stream);

Первый параметр функции — записываемая строка, а второй — указатель на поток вывода. В качестве результата функция возвращает неотрицательное целое число. При ошибках в процессе записи возвращается значение EOF .

Применим функцию для записи в стандартный поток вывода, то есть на консоль. В этом случае в качестве второго параметра надо передать значение stdout :

#include int main(void)

Ввод строк и fgets

Для ввода строки с клавиатуры применяется функция fgets() , которая имеет следующий прототип:

char *fgets(char *str, int count, FILE *stream);

  • char *str : строка, в которую производится считывание.
  • int count : сколько символов необходимо считывать.
  • FILE *stream : файловый поток, из которого производится считывание. В качестве потока ввода может выступать и консольный ввод.

Функция fgets() прекращает считывание, когда пользователь нажимает клавишу ENTER, то есть когда в поток добавляется символ перевода строки.

Рассмотрим считывание строки с консоли. Для этого в качестве третьего параметра в функцию передается значение stdin :

#include #define MAX 15 int main(void)

Здесь функция fgets считывает не более 15 символов в строку name, а В реальности функция предложит ввести 14 символов, так как последний символ зарезервирован для нулевого символа ‘’. Если будет введено больше символов, то fgets все равно считает не более 15 символов. Таким образом функция позволяет проверить количество считываемых символов и поэтому считается безопасной.

Пример работы программы:

Enter name: Tom Smith Your name: Tom Smith

Стоит отметить, что функция fgets() возвращает указатель char * — указатель на буфер, в который считаны данные. В реальности это тот же самый буфер, который передавался в качестве первого параметра, то есть в примере выше — это массив name. Однако этот результат может нам пригодится для проверки успешности выполнения функции — если считывание прошло неудачно, то функция возвращает NULL :

#include #define MAX 15 int main(void) < char name[MAX]; printf(«Enter name: «); if(fgets(name, MAX, stdin) != NULL) // if(fgets(name, MAX, stdin)) — можно сократить < printf(«Your name: %sn», name); >else < printf(«Critical Error. «); >return 0; >

Для эмуляции ошибки можно передать в функцию вторым параметром число 0.

Источник: metanit.com

Функция getchar

Получить символ из стандартного потока ввода. Функция getchar возвращает следующий символ из стандартного потока ввода ( stdin ).
Эта функция эквивалентна getc, которая принимает стандартный поток ввода в качестве аргумента.

Параметры:

Возвращаемое значение

Считанный символ возвращается в виде целого значения.
Если конец файла достигнут или в процессе чтения происходит ошибка, функция возвращает EOF и соответствующие индикаторы ошибки или конца файла устанавливаются. Вы можете использовать любую функцию ferror или feof чтобы определить, произошла ошибка или был достигнут конец файла.

Пример: исходный код программы

//пример использования функции getchar #include int main () < char character; puts(«Введите символ, символ точки — выход(‘.’):»); do < character = getchar(); // считать введённый со стандартногопотока ввода символ putchar (character); // вывести этот символ >while (character != ‘.’); // пока введенный символне точка return 0; >

Читайте также:
Программа домашняя бухгалтерия бесплатная версия что это

Пример работы программы

Простой пример ввода символов. Ввод выполняется до тех пор, пока мы не введём символ точки .

Источник: cppstudio.com

Стандартные потоки ввода/вывода. Функции putchar() и getchar()

На этом занятии затронем тему стандартных потоков ввода/вывода. Вначале отметим на вопрос, что это за потоки и для чего они нужны?

Я думаю, вы все прекрасно понимаете, что программы часто выводят результаты своей работы на монитор, а считывают информацию с клавиатуры. Хотя это и не обязательно так, но чаще всего мы имеем дело именно с монитором и клавиатурой. Так вот, на уровне операционной системы, как правило, имеются три стандартных потока ввода/вывода:

  • stdout – поток вывода информации (как правило, на монитор);
  • stderr – поток вывода ошибок (как правило, на монитор);
  • stdin – поток ввода информации (как правило, с клавиатуры).

Конечно, все эти потоки можно настроить на любые другие устройства. Например, в некоторых случаях поток ошибок stderr ассоциируется с самописцем (принтером), который сразу на бумаге выдает ошибки, произошедшие в процессе работы программы. А поток вывода stdout можно связать с файлом, куда будет выводиться вся информация. Аналогично поток ввода stdin. Вместо клавиатуры можно использовать любое устройство ввода, вплоть до магнитных лент, информация с которых в битовом представлении поступает в поток ввода. То есть, монитор и клавиатура – это всего лишь частные, хотя и частые случаи. Благодаря использованию стандартных потоков ввода/вывода, программы способны универсальным образом работать с любыми устройствами, связанными с этими потоками. И это очень удобно. На программном уровне все эти потоки организованы в виде буферов приема или передачи информации. То есть, данные сначала поступают в буфер, а затем, уже либо на устройство вывода, либо в переменные программы. Это очень важный момент. Данные поступают в программу, например, с клавиатуры, не напрямую, а через буфер ввода. То же самое с выводом. Сначала данные из программы попадаю в буфер вывода и только потом, например, отображаются на мониторе или записываются в файл. Запомним этот момент. Он нам в будущем пригодится.

Функции для работы со стандартными потоками

  • putchar() – вывод символа через поток stdout;
  • printf() – форматный вывод строки через поток stdout;
  • perror() – вывод ошибок в виде строки через поток stderr;
  • getchar() – чтение одного байта (символа) из потока stdin;
  • scanf() – форматный ввод данных из потока stdin.

#include

Функция getchar()

Давайте рассмотрим эти функции и начнем с getchar(). Она имеет следующее определение: int getchar(void); Целочисленный тип int перед функцией означает, что она возвращает целое число, а void в круглых скобках говорит об отсутствии каких-либо параметров. Поэтому мы можем вызвать ее в программе следующим образом:

#include int main(void) { int value = getchar(); return 0; }

После запуска этой программы будет ожидаться ввод значения в поток stdin.

Так как он по умолчанию ассоциирован с клавиатурой, то нам нужно набрать один символ, любой, например, буквы ‘s’ и нажать клавишу Enter. После этого программа продолжится, перейдет к следующему оператору return и завершится. Я напомню, что функция getchar() предназначена для чтения одного байта из входного потока stdin.

И здесь возникает вопрос, почему эта функция возвращает целое число типа int, а не данные типа char, который и описывает один байт памяти? Дело в том, что стандартный поток ввода работает несколько более сложным образом, нежели просто выдача очередного байта из буфера. В частности, он дополнительно генерирует некоторые служебные значения.

Например, значение: EOF (End of File – конец файла) которое определено как -1 в заголовочном файле stdio.h. То есть, помимо байтового диапазона [0; 255] целых чисел функция getchar() дополнительно может вернуть значения вне этого диапазона, в частности, -1. Вам может показаться странным, что мы говорим про константу EOF, когда речь идет о вводе данных с клавиатуры?

Читайте также:
Программа shell для Windows что это

Но, во-первых, стандартный поток ввода stdin вполне можно связать с файлом и тогда данные будут читаться из него, а не с клавиатуры и при достижении конца файла будет сгенерировано значение EOF. И, во-вторых, при вводе с клавиатуры мы также можем симитировать достижение конца файла путем ввода специального символа комбинацией клавиш Ctrl+Z для ОС Windows и Ctrl+D для ОС Linux. Таким образом, функции getchar() нужно возвращать целые значения, превышающий байтовый диапазон [0; 255]. Поэтому разработчик языка Си решил использовать тип int.

Функция putchar()

Следующая аналогичная функция – это putchar(), которая служит для вывода одного байта (символа) в выходной поток stdout и определена следующим образом: int putchar(int ch); Она также возвращает целое число типа int и в качестве аргумента принимает целое значение этого же типа int. В действительности, тип int здесь использован для сопряжения (по типам данных) с функцией getchar(). Иначе бы можно было прописать тип char, так как функция putchar() в качестве аргумента принимает код символа в диапазоне [0;255]. Любое другое значение за пределами этого диапазона просто будет приводиться к восьми битам и затем помещаться в выходной поток stdout. Возвращает эта функция код символа, переданного в выходной поток:

#include int main(void) { int value = getchar(); int res = putchar(value); printf(«n%dn», res); return 0; }

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

putchar(value);

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

Буферы приема/передачи стандартных потоков

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

#include int main(void) { int value1 = getchar(); int value2 = getchar(); printf(«%c %cn», value1, value2); return 0; }

И после запуска этой программы введем с клавиатуры два символа: ds.

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

Соответственно в переменной value1 будет храниться код символа d, а в переменной value2 – код символа s. Затем, функция printf() выводит на экран оба прочитанных символа. Вот наглядный эффект работы входного буфера. Мало того, если бы мы ввели не два, а, скажем, три символа, то после чтения первых двух, последний так бы и остался во входном буфере до момента завершения программы.

При завершении, все буферы автоматически очищаются. На этом мы завершим вводное занятие по стандартным потокам ввода/вывода, а также по функциям getchar() и putchar(). На следующем занятии продолжим эту тему и поговорим о функции printf().

Источник: proproprogs.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru