Книга: UNIX — универсальная среда программирования
6.2 Аргументы программы: vis версия 2
Разделы на этой странице:
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 (''
), поэтому массив можно считать строкой. Эта версия vis
начинает свою работу с того, что проверяет, есть ли аргумент и является ли он -s
. (Неверные аргументы игнорируются.) Функция strcmp(3)
сравнивает две строки, возвращая нуль, если они одинаковы.
В табл. 6.2 перечислены некоторые средства работы со строками и ряд полезных функций, одна из которых strcmp
. Как правило, лучше воспользоваться этими стандартными функциями, чем писать собственные, так как они отлажены и зачастую выполняются быстрее, чем написанные вами, поскольку были оптимизированы для конкретных машин (нередко благодаря использованию Ассемблера).
strcat(s,t) |
Добавляет строку t к строке s; возвращает s |
strncat(s,t,n) |
Добавляет не более n символов t к s |
strcpy(s,t) |
Копирует t в s; возвращает s |
strncpy(s,t,n) |
Копирует точно n символов; при необходимости добавляет NULL |
strcmp(s,t) |
Сравнивает s и t , возвращает <0, 0, >0 при <, ==, > |
strncmp(s,t,n) |
Сравнивает не более n символов |
strlen(s) |
Возвращает длину s |
strchr(s,c) |
Возвращает указатель на первый символ с в s и NULL , если с отсутствует |
strrchr(s,c) |
Возвращает указатель на последний с в s и NULL , если с отсутствует. |
atoi(s) |
Возвращает целое значение s |
atof(s) |
Возвращает "плавающее" значение s; необходимо описание double atof() |
malloc(n) |
Возвращает указатель на область памяти в n байт и NULL , если это невозможно |
calloc(n,m) |
Возвращает указатель на n*m обнуленных байтов и NULL , если это невозможно; malloc и calloc возвращают значение типа char* |
free(p) |
Освобождает память, выделенную malloc и calloc |
Таблица 6.2: Стандартные функции, выполняемые над строками
Упражнение 6.3
Измените аргумент -s
так, чтобы vis -sn
печатала только строки из n или более печатаемых символов, опуская непечатаемые символы и короткие последовательности обычных, печатаемых символов. Это полезно при выделении ''текстовых'' частей в нетекстовых файлах, таких, как рабочие программы. Некоторые версии системы содержат для подобных целей программу strings
. Что лучше: иметь отдельную программу или пользоваться специальным аргументом vis
?
Упражнение 6.4
Доступность исходной программы на Си — одно из достоинств системы UNIX; такая программа демонстрирует элегантные решения многих программистских проблем. Прокомментируйте баланс между наглядностью программы на Си и встречающимися "оптимизированными" фрагментами, переписанными на Ассемблере.
- Миграция между различными версиями InterBase
- СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Аргументы функции в Python
- Возможности, планируемые к реализации в следующих версиях
- Версия 1.5 - эволюция или революция?
- Новая версия ODS
- 1.2.5. Пример программы
- 24.7. Использование программы-твикера
- 10. FUTURE REVISIONS OF THIS LICENSE
- Глава 10 Возможности подсистемы хранения данных в различных версиях Windows NT
- Часть III Прикладные программы