Перейти к содержанию

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

Материал из Викиучебника — открытых книг для открытого мира

Язык Си в примерах


  1. Компиляция программ
  2. Простейшая программа «Hello World»
  3. Учимся складывать
  4. Максимум
  5. Таблица умножения
  6. ASCII-коды символов
  7. Верхний регистр
  8. Скобочки
  9. Факториал
  10. Степень числа
  11. Треугольник Паскаля
  12. Корень уравнения
  13. Система счисления
  14. Сортировка
  15. Библиотека complex
  16. Сортировка на основе qsort
  17. RPN-калькулятор
  18. RPN-калькулятор на Bison
  19. Простая грамматика
  20. Задача «Расчёт сопротивления схемы»
  21. Простая реализация конечного автомата
  22. Использование аргументов командной строки
  23. Чтение и печать без использования stdio
  24. Декодирование звукозаписи в формате ADX
  25. Другие примеры
  26. XCC C
Дано
произвольная кодовая (октетная) последовательность (возможно — в коде ASCII) на стандартном вводе программы. Последовательность конечна, но ее длина заранее неизвестна.
Надо
вывести на стандартный вывод дамп последовательности — разделенные пробельными символами числовые значения считанных кодов.

Решение

[править]

#include <assert.h>
#include <stdio.h>

int main ()
{
  int c;
  while ((c = getchar ()) != EOF) {
    printf (" %3d%s", c, (c == '\n' ? "\n" : ""));
  }
  assert (! ferror (stdin));

  return 0;
}

Главный цикл этой программы напоминает таковой для рассмотренной в разделе Максимум; в частности, мы вновь используем цикл «пока» (while).[1] Однако, вместо scanf для чтения чисел, здесь мы обращаемся к функции getchar для чтения отдельных знаков (кодов.)[2] Мы по-прежнему используем printf — для вывода кода символа в десятичной записи.[3]

С другой стороны, из условия корректности ввода исключается требование возврата именно EOF (как признака исчерпания входного потока), поскольку это условие уже является условием завершения главного цикла. Это различие связано с тем, что в данной программе не требуется опозновать «подходящий» ввод — допустимой является совершенно любая последовательность символов (кодов.) Напротив, в предыдущей программе мы принимали исключительно целые числа в десятичной записи.

Требование ложности значения функции признака ошибки ferror для стандартного ввода (stdin) по завершении главного цикла остается в силе.[4]

Подчеркнем, что диапазон возвращаемых функцией getchar значений — это диапазон «символьного» типа char плюс одно значение, а именно — признак конца потока EOF.[2] Как следствие, иногда встречаемое в примерах кода чтение символа из потока непосредственно в переменную типа char не вполне корректно — для этих целей следует всегда использовать переменную типа int.

Обратите внимание, что сформировать условие «конец потока» при вводе с клавиатуры можно вводом (в зависимости от системы и предполагая настройки по-умолчанию) Control-d или Control-z (также обозначаются C-d, ^D, C-z, ^Z.)

Задания

[править]
  1. Проверьте работу программы вводом строки Hello! В коде ASCII, выводом программы окажется 72 101 108 108 111 33 10 (где 10 — управляющий код разрыва строки.)
  2. Введите строку Привет!. В зависимости от системы и ее настроек (так называемой локали), вывод может содержать 8 (при использовании однобайтных кириллических кодировок) или 14 кодов (UTF-8).
  3. Изучите коды, формируемые такими клавишами и сочетаниями, как ESC, F5, , Alt-x, Control-r.
  4. Исследуйте работу программы на «нетекстовых» потоках небольшого (до примерно 500 байт) объема — изображениях (.png, .jpeg), упакованных файлах (.gz, .bz2) и др. Попробуйте установить закономерности. (Указание: обратите внимание на значения первых пяти—десяти кодов.)
  5. Предложенный вариант программы разрывает (\n) выходные строки по границам входных. Реализуйте также разрыв выходных строк по достижению определенного количества выведенных в одной строке кодов (например, каждые 16.)
  6. Разработайте варианты программы, выводящие считанные коды в шестнадцатиричном и восьмеричном представлениях. (Указание: воспользуйтесь материалом раздела Скалярные типы.)
  7. Напишите программу, которая печатает все символы и их ASCII-коды.
  8. Попробуйте напечатать как символ число больше 255. Что получается?
  9. Ознакомьтесь с описанием программы od в стандарте POSIX и в документации к пакету GNU Coreutils.[5][6]

См. также

[править]

Примечания

[править]
  1. 6.8.5.1 The while statement(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  2. а б 7.21.7.6 The getchar function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  3. 7.21.6.1 The fprintf function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  4. 7.21.10.3 The ferror function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  5. od – dump files in various formats(англ.) IEEE Std 1003.1-2013. The IEEE and The Open Group. Проверено 2015-03-13 г.
  6. od invocation(англ.) GNU Coreutils. Free Software Foundation. Проверено 2015-03-13 г.