Чтение онлайн

на главную - закладки

Жанры

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
рейтинг книги
Отмороженный 8.0

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Ермак. Телохранитель

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Свет Черной Звезды

Звездная Елена
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Свет Черной Звезды

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад