Язык Си в примерах/ASCII-коды символов: различия между версиями

Содержимое удалено Содержимое добавлено
Дополнения; →‎Решение: переписано.
→‎Решение: Уточнения, включая учитывающие последние изменения в ../Максимум.
Строка 25:
''Главный цикл'' этой программы напоминает таковой для рассмотренной в разделе [[../Максимум/]]; в частности, мы вновь используем цикл «пока» (<code >while</code>).<ref name="while" /> Однако, вместо <code >scanf</code> для чтения чисел, здесь мы обращаемся к функции <code >getchar</code> для чтения отдельных ''знаков'' (кодов.)<ref name="getchar" /> Мы по-прежнему используем <code >printf</code> — для вывода кода символа в десятичной записи.<ref name="fprintf" />
 
С другой стороны, из ''условия корректности'' ввода исключается требование возврата именно <code >EOF</code> (как признака ''исчерпания'' входного потока), поскольку это условие <em >уже</em> является условием завершения ''главного цикла''. Это различие связано с тем, что в данной программе не требуется опозновать «подходящий» ввод — допустимой является совершенно <em >любая</em> последовательность символов (кодов.) Напротив, [[../Максимум#intstats.c |в предыдущей программе]] мы принимали исключительно целые числа в десятичной записи.
Кроме того, меняется ''условие корректности'' ввода: если в предыдущей программе мы требовали возврата <code >EOF</code> как признака ''исчерпания'' входного потока, то <code >getchar</code> определена стандартом как возвращающая <code >EOF</code> также и как ''признак ошибки ввода.''<ref name="getchar" /> Поэтому, завершив чтение, мы явно требуем ''ложности'' значения функции ''признака ошибки'' <code >ferror</code> для стандартного ввода (<code >stdin</code>.)<ref name="ferror" />
 
Требование ''ложности'' значения функции ''признака ошибки'' <code >ferror</code> для стандартного ввода (<code >stdin</code>) по завершению ''главного цикла'' остается в силе.<ref name="ferror" />
 
Подчеркнем, что диапазон возвращаемых функцией <code >getchar</code> значений — это диапазон «символьного» типа <code >char</code> <em >плюс одно значение,</em> а именно — признак конца потока <code >EOF</code>.<ref name="getchar" /> Как следствие, иногда встречаемое в примерах кода чтение символа из потока непосредственно в переменную типа <code >char</code> <em >не вполне корректно</em> — для этих целей следует <em >всегда</em> использовать переменную типа <code >int</code>.
 
<strong >Обратите внимание,</strong> что сформировать условие «конец потока» при вводе с клавиатуры можно вводом (в зависимости от системы и предполагая настройки по-умолчанию) <kbd >Control-d</kbd> или <kbd >Control-z</kbd> (также обозначаются <kbd >C-d</kbd>, <kbd >^D</kbd>, <kbd >C-z</kbd>, <kbd >^Z</kbd>.)