Язык Си в примерах/ASCII-коды символов: различия между версиями
Содержимое удалено Содержимое добавлено
ISbot (обсуждение | вклад) м {{BookCat}}; избыточные <big /> и <font /> вокруг <source />; ссылки; пробелы. |
Дополнения; →Решение: переписано. |
||
Строка 1:
{{{{Book template}}/Содержание
; Дано: произвольная кодовая (''октетная'') последовательность (возможно — в коде {{w |ASCII}}) на [[w:Стандартные потоки#Стандартный ввод |стандартном вводе]] программы. Последовательность конечна, но ее длина заранее неизвестна.
; Надо: вывести на [[w:Стандартные потоки#Стандартный вывод |стандартный вывод]] ''дамп'' последовательности — разделенные пробельными символами числовые значения считанных кодов.
== Решение ==
{{Якорь |decdump.c}}
<source lang="c">
#include <stdio.h>
int main ()▼
int
{
while ((c = getchar ()) != EOF) {
printf (" %3d%s", c, (c == '\n' ? "\n" : ""));
}
assert (!
return
}
</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" />
==
* [[Кодирование текста]]
* {{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}}
|