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

Содержимое удалено Содержимое добавлено
м {{BookCat}}; избыточные <big /> и <font /> вокруг <source />; ссылки; пробелы.
Дополнения; →‎Решение: переписано.
Строка 1:
{{{{Book template}}/Содержание «Язык Си в примерах»}}
 
; Дано: произвольная кодовая (''октетная'') последовательность (возможно — в коде {{w |ASCII}}) на [[w:Стандартные потоки#Стандартный ввод |стандартном вводе]] программы. Последовательность конечна, но ее длина заранее неизвестна.
В языке C есть тип <tt>char</tt> для символов.
; Надо: вывести на [[w:Стандартные потоки#Стандартный вывод |стандартный вывод]] ''дамп'' последовательности — разделенные пробельными символами числовые значения считанных кодов.
Каждому символу сопоставлено число от 0 до 255, которое называется ASCII-кодом символа.
Например, символу 'A' соответствует число 65. Символами можно оперировать,
как числами и, наоборот, переменные типа <tt>int</tt> можно интепретировать
как символы (сравнивать с символами или печатать как символы).
 
== Решение ==
Для того, чтобы считывать один символ есть
функция <tt>getchar</tt> из библиотеки <tt>stdio</tt>.
 
 
Логика приведенной ниже программы следующая.
Считывается символ и печатается в двух форматах: как символ (формат <tt>"%c"</tt>)
и как число (формат <tt>"%d"</tt>). Это делается до тех пор,
пока символ (а точнее его ASCII код) не будет равен 27, то есть пока
не будет нажата клавиша ESC.
 
Выражение <tt>ch != 27</tt> означает логическое <tt> ch <math>\ne \;</math> 27 </tt>.
 
{{Якорь |decdump.c}}
<source lang="c">
#include <stdio.h>
 
int main ()
int
int main ()
{
int chc;
while ((c = getchar ()) != EOF) {
do {
printf (" %3d%s", c, (c == '\n' ? "\n" : ""));
ch = getchar();
}
printf ("Вы нажали %c. ASCII код = %d\n", ch, ch);
assert (! } whileferror (ch != 27stdin));
 
return( 0);
}
</source>
 
''Главный цикл'' этой программы напоминает таковой для рассмотренной в разделе [[../Максимум/]]; в частности, мы вновь используем цикл «пока» (<code >while</code>).<ref name="while" /> Однако, вместо <code >scanf</code> для чтения чисел, здесь мы обращаемся к функции <code >getchar</code> для чтения отдельных ''знаков'' (кодов.)<ref name="getchar" /> Мы по-прежнему используем <code >printf</code> — для вывода кода символа в десятичной записи.<ref name="fprintf" />
 
Кроме того, меняется ''условие корректности'' ввода: если в предыдущей программе мы требовали возврата <code >EOF</code> как признака ''исчерпания'' входного потока, то <code >getchar</code> определена стандартом как возвращающая <code >EOF</code> также и как ''признак ошибки ввода.''<ref name="getchar" /> Поэтому, завершив чтение, мы явно требуем ''ложности'' значения функции ''признака ошибки'' <code >ferror</code> для стандартного ввода (<code >stdin</code>.)<ref name="ferror" />
 
<strong >Обратите внимание,</strong> что сформировать условие «конец потока» при вводе с клавиатуры можно вводом (в зависимости от системы и предполагая настройки по-умолчанию) <kbd >Control-d</kbd> или <kbd >Control-z</kbd> (также обозначаются <kbd >C-d</kbd>, <kbd >^D</kbd>, <kbd >C-z</kbd>, <kbd >^Z</kbd>.)
 
== Задания ==
 
# Проверьте работу программы вводом строки <code >Hello!</code> В коде {{w |ASCII}}, выводом программы окажется <code > 72 101 108 108 111 33 10</code> (где 10 — [[w:Управляющие символы |управляющий]] код [[w:Перевод строки |разрыва строки.]])
# Введите строку <code >Привет!</code>. В зависимости от системы и ее настроек (так называемой ''локали''), вывод может содержать 8 (при использовании ''однобайтных'' кириллических кодировок) или 14 кодов ({{w |UTF-8}}).
# Изучите коды, формируемые такими клавишами и сочетаниями, как <kbd >ESC</kbd>, <kbd >F5</kbd>, <kbd >↑</kbd>, <kbd >Alt-x</kbd>, <kbd >Control-r</kbd>.
# Исследуйте работу программы на «нетекстовых» потоках небольшого (до примерно 500 байт) объема — изображениях (<code >.png</code>, <code >.jpeg</code>), упакованных файлах (<code >.gz</code>, <code >.bz2</code>) и др. Попробуйте установить закономерности. (Указание: обратите внимание на значения первых пяти—десяти кодов.)
# [[#decdump.c |Предложенный]] вариант программы разрывает (<code >\n</code>) выходные строки по границам входных. Реализуйте также разрыв выходных строк по достижению определенного количества выведенных в одной строке кодов (например, каждые 16.)
# Разработайте варианты программы, выводящие считанные коды в шестнадцатиричном и восьмеричном представлениях. (Указание: воспользуйтесь материалом раздела [[../Скалярные типы/]].)
#Напишите программу, которая печатает все символы и их ASCII-коды.
#Попробуйте напечатать как символ число больше 255. Что получается?
# Ознакомьтесь с описанием программы <code >od</code> в стандарте {{w |POSIX}} и в документации к пакету {{w |GNU Coreutils}}.<ref name="posix-od" /><ref name="gnu-od" />
 
== ПриложениеСм. также ==
* [[Кодирование текста]]
* Расширенная кодовая страница ASCII (см. также [http://www.asciitable.com asciitable.com]): <br />
* {{w |ASCII}}
* http://digteh.ru/proc/text.php Запись текстов двоичным кодом (Запись букв двоичным кодом)
* http://asciitable.com/
* http://digteh.ru/proc/text.php Запись— запись текстов двоичным кодом (Запись букв) двоичным кодом).
 
[[Файл:Ascii Table-nocolor.svg]]
 
== Примечания ==
{{Примечания | refs =
<!-- Пожалуйста поддерживайте алфавитный порядок для name. Спасибо. -->
<ref name="ferror" >{{Cite web | title = 7.21.10.3 The ferror function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=357 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="fprintf" >{{Cite web | title = 7.21.6.1 The fprintf function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=327 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="getchar" >{{Cite web | title = 7.21.7.6 The getchar function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=350 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="gnu-od" >{{Cite web | title = od invocation | url = //gnu.org/software/coreutils/manual/html_node/od-invocation.html | work = GNU Coreutils | publisher = Free Software Foundation | lang = en | accessdate = 2015-03-13}}</ref>
<ref name="posix-od" >{{Cite web | title = od – dump files in various formats | url = http://pubs.opengroup.org/onlinepubs/9699919799/utilities/od.html | work = IEEE Std 1003.1-2013 | publisher = The IEEE and The Open Group | lang = en | accessdate = 2015-03-13}}</ref>
<ref name="while" >{{Cite web | title = 6.8.5.1 The while statement | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=169 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
}}
 
{{BookCat}}