Перейти к содержимому

Getchar c что это

  • автор:

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

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

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

char ch = 'c'; putchar('a'); putchar(98); putchar('\n'); putchar(ch);
ab c

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

char str[] = "Hello"; int i; // первое Hello printf("%s\n", str); // второе Hello for (i = 0; str[i] != '\0'; i++) putchar(str[i]); printf("\n");

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

char str[] = "Hello"; int i; for (i = 0; str[i] != '\0'; i++) printf("%c-",str[i]); printf("%c%c %c",'\b', '\0', '\n'); for (i = 0; str[i] != '\0'; i++) { putchar(str[i]); putchar('-'); } printf("%c%c %c",'\b', '\0', '\n');
H-e-l-l-o H-e-l-l-o

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

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

int a; a = getchar(); printf("%c ", a); putchar(a); putchar('\n');

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

u u u

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

char a, b, c; a = getchar(); putchar(a); b = getchar(); putchar(b); c = getchar(); putchar(c); printf("\n");

Как вы думает, как он будет выполняться? По идее после ввода символа, он должен сразу отображаться на экране функцией 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 приводится пример считывания символов, вводимых пользователем, и их вывод на экран:

int a; a = getchar(); while (a != '\n') { putchar(a); a = getchar(); } putchar('\n');

В переменной a всегда хранится последний введенный символ, но перед тем как присвоить a новое значение с помощью функции putchar() старое значение сбрасывается в буфер. Как только поступает символ новой строки, работа программы прекращается, а также, поскольку была нажата клавиша Enter, происходит вывод содержимого буфер на экран. Если в условии цикла while будет не символ ‘\n’, а какой-нибудь другой, то программа будет продолжать обрабатывать символы, даже после нажатия Enter. В результате чего мы можем вводить и выводить множество строк текста.

Напишите программу посимвольного ввода-вывода, используя в качестве признака окончания ввода любой символ, кроме ‘\n’. Протестируйте ее.

При совместном использовании функций putchar() и getchar() обычно пользуются более коротким способом записи. Например:

while ((a = getchar()) != '~') putchar(a);
  1. Объясните, почему сокращенный вариант записи посимвольного ввода-вывода работает правильно. Для этого опишите последовательность операций в условии цикла while .
  2. Перепишите вашу программу на более короткий вариант.

EOF

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

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

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

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

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

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

#include #define N 100 int main () { char ch; char nums[N]; int i; i = 0; while ((ch = getchar()) != EOF && i  N-1) if (ch >= 48 && ch  57) { nums[i] = ch; i++; } nums[i] = '\0'; printf("%s\n", nums); }
  1. Напишите программу, которая считает количество введенных пользователем символов и строк.
  2. Напишите программу, которая подсчитывает количество слов в строке.

Курс с решением части задач:
pdf-версия

Getchar c что это

#include
int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int getc(FILE *stream);
int getchar(void);
int ungetc(int c, FILE *stream);

ОПИСАНИЕ

Функция fgetc() считывает очередной символ из потока stream и возвращает unsigned char преобразованный в int, или EOF при достижении конца файла или при возникновении ошибки. Функция getc() похожа на fgetc(), но она может быть реализована как макрос, который определяет состояние stream более одного раза. Функция getchar() эквивалентна getc(stdin). Функция fgets() считывает максимум size -1 символов из stream и записывает их в буфер, на который указывает s. Чтение прерывается по достижении EOF или символа новой строки. Если получен символ новой строки, то он заносится в буфер. В конец буфера после последнего символа добавляется завершающий байт null (‘\0’). Функция ungetc() заносит c обратно в stream, преобразует в unsigned char, если это возможно для дальнейших операций чтения. Занесённые обратно символы будут возвращаться в обратном порядке; гарантируется только одно занесение символов. Вызовы функций, описанные здесь, могут смешиваться друг с другом и с другими функциями ввода из библиотеки stdio для того же потока ввода. Неблокирующие аналоги смотрите в unlocked_stdio(3).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функции fgetc(), getc() и getchar() возвращают символ, считанный как unsigned char и преобразованный в int, или EOF по достижении конца файла или при возникновении ошибки. Функция fgets() возвращает s при удачном выполнении и NULL при ошибке или если достигнут конец файла, а символы остались несчитанными. При успешном выполнении функция ungetc() возвращает c или EOF при ошибке.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
fgetc(), fgets(), getc(),
getchar(), ungetc()
безвредность в нитях безвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX.1-2001, POSIX.1-2008, C89, C99. Не рекомендуется чередовать вызовы функций ввода библиотеки stdio с низкоуровневыми вызовами read(2) для дескриптора файла, связанного с потоком ввода; результат этого будет неопределённым и, скорее всего, не тем, который ожидается.

Урок 1. Часть 3: Инструкции языка Си scanf, gets, getchar — ввод данных

егэ разбор егэ разбор pascal уроки c уроки python уроки c++ уроки vb уроки lazarus уроки php уроки html уроки css уроки javascript уроки jquery и ajax уроки prolog уроки flash уроки

Ввод данных — это предоставление компьютеру информации, необходимой для работы программы. Вводимая информация присваивается переменным и хранится в памяти компьютера. В программе переменная используется в операциях и выражениях.

Функция Си gets() помещает в переменную вводимую строку. В качестве параметра функции указывается имя переменной, в которую и помещается строка.

Пример: в программе функция gets() рассматривает первые 14 символов (один элемент необходим для нулевого символа, поэтому в скобках следует указывать на один символ больше) и помещает введенную строку в переменную name; затем выводит ее значение на экран

main() { char name[15]; puts(“введите имя”); gets(name); puts(name); }

Показать аналог в Pascal

var name:string; begin writeln('введите имя'); readln(name); writeln(name); end.

var name:string; begin writeln(‘введите имя’); readln(name); writeln(name); end.

Функция языка Си getchar

Функция Си getchar() запрашивает с клавиатуры единичный символ и практически для всех компиляторов безразлично, к какому типу (char или int) относится данный символ.

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

Пример: в программе запрашивать ввод символа, после чего выводить его на экран при помощи функций Си putchar и ptintf

#include main() { int bukva; puts("введите букву"); bukva=getchar(); putchar(bukva); putchar('\n'); printf("%c", bukva); }

Важно: для работы данной функции скорее всего потребуется подключение заголовочного файла stdio.h

Для сравнения выполним ту же задачу с функцией Си gets():

main() { char bukva; puts("введите букву"); gets(bukva); printf("%s", bukva); }

Функция языка Си scanf

Функция Си scanf () является более многогранной функцией, так как позволяет вводить в компьютер данные любых типов.

язык си scanf ввод данных

По аналогии с функцией printf() функция Си scanf() тоже может иметь несколько аргументов, позволяя тем самым вводить значения числовых, символьных и строковых переменных в одно и то же время.

Список параметров функции scanf() состоит из двух частей: строки формата и списка данных. В строке формата находятся указатели формата (преобразователи символов, после знака процента), которые определяют то, каким образом должны быть интерпретированы вводимые данные. Вторая часть функции — список данных, в котором перечисляются переменные, в которые должны быть занесены вводимые значения. Порядок следования указателей формата и переменных должен быть одинаков.

Указатели формата аналогичны тем, которые используются функцией printf.

Пример: функция scanf() вводит вещественное число и и присваивает его переменной amount (вносит его в область памяти, предназначенную для переменной)

main() { float amount; scanf("%f", &amount) }

Функция getchar

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

Параметры:

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

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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *