Язык Си в примерах/ASCII-коды символов
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII-коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN-калькулятор
- RPN-калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
- Декодирование звукозаписи в формате ADX
- Другие примеры
- 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.)
Задания
[править]- Проверьте работу программы вводом строки
Hello!
В коде ASCII, выводом программы окажется72 101 108 108 111 33 10
(где 10 — управляющий код разрыва строки.) - Введите строку
Привет!
. В зависимости от системы и ее настроек (так называемой локали), вывод может содержать 8 (при использовании однобайтных кириллических кодировок) или 14 кодов (UTF-8). - Изучите коды, формируемые такими клавишами и сочетаниями, как ESC, F5, ↑, Alt-x, Control-r.
- Исследуйте работу программы на «нетекстовых» потоках небольшого (до примерно 500 байт) объема — изображениях (
.png
,.jpeg
), упакованных файлах (.gz
,.bz2
) и др. Попробуйте установить закономерности. (Указание: обратите внимание на значения первых пяти—десяти кодов.) - Предложенный вариант программы разрывает (
\n
) выходные строки по границам входных. Реализуйте также разрыв выходных строк по достижению определенного количества выведенных в одной строке кодов (например, каждые 16.) - Разработайте варианты программы, выводящие считанные коды в шестнадцатиричном и восьмеричном представлениях. (Указание: воспользуйтесь материалом раздела Скалярные типы.)
- Напишите программу, которая печатает все символы и их ASCII-коды.
- Попробуйте напечатать как символ число больше 255. Что получается?
- Ознакомьтесь с описанием программы
od
в стандарте POSIX и в документации к пакету GNU Coreutils.[5][6]
См. также
[править]- Кодирование текста
- ASCII
- http://asciitable.com/
- http://digteh.ru/proc/text.php — запись текстов (букв) двоичным кодом.
Примечания
[править]- ↑ 6.8.5.1 The while statement(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
- ↑ а б 7.21.7.6 The getchar function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
- ↑ 7.21.6.1 The fprintf function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
- ↑ 7.21.10.3 The ferror function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
- ↑ od – dump files in various formats(англ.) IEEE Std 1003.1-2013. The IEEE and The Open Group. Проверено 2015-03-13 г.
- ↑ od invocation(англ.) GNU Coreutils. Free Software Foundation. Проверено 2015-03-13 г.