Особенности языка С. Учебное пособие putchar() и getchar()В заголовочном файле stdio.h содержится объявление не только функции Функция char ch = 'c'; putchar('a'); putchar(98); putchar('\n'); putchar(ch); Результат: ab c
Функции char str[] = "Hello"; int i; printf("%s\n", str); // первое Hello for (i = 0; str[i] != '\0'; i++) // второе Hello putchar(str[i]); printf("\n"); В результате выполнения этого кода на экране будут напечатаны два слова "Hello", разделенные переходом на новую строку. С 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 Поэтому выбор в пользу той или иной функции зависит от ситуации и ваших предпочтений. В отличие от функции int a; a = getchar(); printf("%c ", a); putchar(a); putchar('\n'); Если при выполнении этого кода ввести символ, то после нажатия Enter вы увидите два таких же символа на экране: u u u
Первый — результат выполнения функции char a, b, c; a = getchar(); putchar(a); b = getchar(); putchar(b); c = getchar(); putchar(c); printf("\n"); Как вы думает, как он будет выполняться? По идее после ввода символа, он должен сразу отображаться на экране функцией Задание Прежде чем попытаться найти объяснение, изобразим "некорректного пользователя" и перед первым нажатием Enter введем несколько символов (больше двух). После Enter вы увидите три первых символа введенной вами строки, и программа завершиться. Хотя куда логичней было бы ожидать, что будет прочитан только первый символ, потом выведен на экран и потом запрошен следующий символ. Задание Такое странное на первый взгляд поведение программы связано не с языком C, а с особенностью работы операционных систем, в которых реализован буферизованный ввод-вывод. При операциях ввода-вывода выделяется область временной памяти (буфер), куда и помещаются поступающие символы. Как только поступает специальный сигнал (например, переход на новую строку при нажатии Enter), данные из буфера передаются по месту своего назначения (на экран, в переменную и др.). Теперь, зная это, давайте посмотрим, что происходило в нашей программе, и сначала разберем второй случай с "некорректным пользователем", т.к. для понимания этот случай проще. Когда пользователь ввел первый символ, он попал в переменную a, далее сработала функция Почему же в первом случае при выполнении программы мы смогли ввести и увидеть на экране только два символа? Когда был введен первый символ, то он был присвоен переменной 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. В результате чего мы можем вводить и выводить множество строк текста.
Задание При совместном использовании функций while ((a = getchar()) != '~') putchar(a); Задание
EOFКак быть, если требуется "прочитать" с клавиатуры или файла неизвестный текст, в котором может быть абсолютно любой символ? Как сообщить программе, что ввод окончен, и при этом не использовать ни один из возможных символов? В операционных системах и языках программирования вводят специальное значение, которое служит признаком окончания потока ввода или признаком конца файла. Называется это значение EOF (end of file), а его конкретное значение может быть разным, но чаще всего это число -1. EOF представляет собой константу, в программном коде обычно используется именно имя (идентификатор) константы, а не число -1. EOF определена в файле stdio.h. В операционных системах GNU/Linux можно передать функции Задание Решение задачНе смотря на свою кажущуюся примитивность, функции #include <stdio.h> #define N 100 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); } Здесь ввод символов может прекратиться не только при поступлении значения EOF, но и в случае, если массив заполнен ( i < N-1). В цикле while проверяется условие, что числовой код очередного символа принадлежит диапазону [48, 57]. Именно в этом диапазоне кодируются цифры (0-9). Если поступивший символ является символом-цифрой, то он помещается в массив по индексу i, далее i увеличивается на 1, указывая на следующий элемент массива. После завершения цикла к массиву символов добавляется нулевой символ, т.к. по условию задачи должна быть получена строка (именно для этого символа ранее резервируется одна ячейка массива – N-1).
Задание
|
|||


Последние комментарии
4 дня 16 часов назад
4 дня 17 часов назад
4 дня 17 часов назад
4 дня 18 часов назад
1 неделя 4 дня назад
1 неделя 4 дня назад
1 неделя 5 дней назад
1 неделя 6 дней назад
1 неделя 6 дней назад
2 недели 6 дней назад