UNIX — универсальная среда программирования
Шрифт:
exit(0);
}
Getchar
возвращает из входного потока очередной байт или значение EOF, когда встречает конец файла (или ошибку). Между прочим, EOF не является байтом из файла; вспомните: во второй главе объяснялось, что такое "конец файла". Значение EOF отличается от значения любого байта, поэтому его трудно спутать с реальными данными; переменная с описана как int
(целая), а; не как char
(символьная), так что она может хранить значение EOF. Строка
#include <stdio.h>
должна находиться в начале каждого исходного файла. Это заставляет компилятор Си читать файл макроопределений (
/usr/include/stdio.h
), в котором специфицированы
EOF
. Мы будем использовать <stdio.h>
как краткую запись полного имени файла. Файл
<ctype.h>
— еще один файл макроопределений в /usr/include
, который задает машинно-независимые макрокоманды (макросы) для классификации символов. Чтобы выяснить, принадлежит ли входной символ набору ASCII (т.е. его значение меньше 0200) и печатается ли он, мы использовали здесь isascii
и isprint
. Остальные макросы перечислены в табл. 6.1. Отметим, что <ctype.h>
определяет символы "перевод строки", "табуляция" и пробел как непечатаемые. isalpha(c) | Буква принадлежит алфавиту: a-z A-Z |
isupper(c) | Прописная буква: A-Z |
islower(с) | Строчная буква: a-z |
isdigit(c) | Цифра: 0-9 |
isxdigit(c) | Шестнадцатеричная цифра: 0-9 a-f A-F |
isalnum(c) | Буква или цифра |
isspace(c) | Пробел, символ табуляции, символ перевода строки, символ вертикальной табуляции, символ перевода страницы, символ возврата |
ispunct(c) | Не буквенно-цифровой символ, не управляющий, не пробел |
isprint(c) | Печатаемый: любой графический символ |
iscntrl(c) | Управляющий символ: 0 <= с < 040 || с == 0177 |
isascii(c) | Символ ASCII: 0 <= с <= 0177 |
Таблица 6.1: Макросы классификации символов <ctype.h>
Вызов
exit
в конце vis
не является необходимым для корректной работы программы, но гарантирует тому, кто эту программу вызвал, получение нормального кода ее завершения (обычно нуля). Другой способ возврата кода завершения выполнить в теле функции main
оператор return 0
; возвращаемое значение main
и есть код завершения программы. Если нет явно указанных return
или exit
, код завершения не определен. Для компиляции программы на Си поместите исходный текст в файл, имя которого оканчивается на
.с
, например vis.с
, оттранслируйте его с помощью сс
и запустите на выполнение результат, оставляемый компилятором в файле с именем a.out
('а' — ассемблер):
$ сс vis.с
$ a.out
hello worldctl^g
hello world\007
ctl-d
$
a.out
можно переименовать после
– о
команды сс
: $ сс -о vis vis.с
Результат в vis, а не в a.out Упражнение 6.1
Мы решили, что символы табуляции не следует делать видимыми, изображая их как
\011
, – >
или \t
, поскольку главное назначение vis
— поиск действительно аномальных символов. Можно принять альтернативное решение и недвусмысленно идентифицировать каждый символ в выходном потоке: символы табуляции, неграфические символы, пробелы в конце строки и т.п. Модифицируйте vis
так, чтобы символы табуляции, обратная дробная черта, "шаг назад", перевод страницы и др. печатались в традиционном, принятом в Си представлении: \t
, \\
, \b
, \f
и т.д., причем пробелы в конце строки должны быть помечены. Можете сделать это недвусмысленным образом? Сравните ваш вариант с приведенным ниже:
$ sed -n 1
Упражнение 6.2
Модифицируйте
vis
так, чтобы она приводила длинные строки к строкам некоторой разумной длины. Как это согласуется с требованием недвусмысленности результата из предыдущего упражнения? 6.2 Аргументы программы:
vis
версия 2 Когда выполняется программа на Си, функции
main
передаются следующие аргументы из командной строки: счетчик argc
и массив argv
, состоящий из указателей символьных строк, содержащих аргументы. По соглашению argv[0]
это имя самой команды, так что argc
всегда больше нуля; "полезными" же являются аргументы argv[1]
...argv[argc - 1
]. Вспомните, что переключение входного или выходного потоков с помощью <
и >
осуществляется в shell
, а не отдельными программами, поэтому такое переключение не влияет на число аргументов, видимых программой. Для иллюстрации работы с аргументами модифицируем
vis
, добавив флаг: vis -s
удаляет любые непечатаемые символы вместо того, чтобы выделять их. Такое удаление удобно для "чистки" файлов из других систем, например тех, которые используют для завершения строки CRLF (символы возврата каретки и перевода строки) вместо одного символа перевода строки.
/* vis: make funny characters visible (version 2) */
#include <stdio.h>
#include <ctype.h>
main(argc, argv)
int argc;
char *argv[];
{
int c, strip = 0;
if (argc > 1 && strcmp(argv[1], "-s") == 0)
strip = 1;
while ((c = getchar) != EOF)
if (isascii(c) &&
(isprint(с) || c=='\n' || c=='\t' || c==' '))
putchar(c);
else if (!strip)
printf("\\%03o", c);
exit(0);
}
Здесь
argv
— указатель массива, элементы которого служат указателями массивов символов; каждый такой массив заканчивается символом ASCII NUL ('\0'
), поэтому массив можно считать строкой. Эта версия vis
начинает свою работу с того, что проверяет, есть ли аргумент и является ли он – s
. (Неверные аргументы игнорируются.) Функция strcmp(3)
сравнивает две строки, возвращая нуль, если они одинаковы.
Поделиться:
Популярные книги
Отмороженный 8.0
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Газлайтер. Том 14
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Ермак. Телохранитель
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Матабар IV
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Сборник коротких эротических рассказов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Идеальный мир для Лекаря 19
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Дочь моего друга
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Свет Черной Звезды
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Кодекс Крови. Книга IV
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 22
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Попаданка в академии драконов 4
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Сердце Дракона. Том 12
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Лолита
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Сводный гад
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00