Главная » Программирование для UNIX » Аргументы программы: vis, версия 2

0

Когда   программа, написанная  на  Си,  выполняется,  аргументы командной строки  становятся доступны функции main как  количество argc и массив указателей на символьные строки, содержащие аргументы, argv. Принято соглашение о том,  что argv[0] – это имя  самой  команды, так  что argc всегда больше 0; «полезными» же являются аргументы argv[1] …argv[argc–1]. Вам уже известно, что перенаправления ввода и вывода < и > осуществляются оболочкой, а не отдельными программами,  поэтому перенаправление  не  влияет на  количество аргу ментов, которые видит программа.

Чтобы пояснить, как происходит обработка аргументов, давайте изме ним  программу vis, добавив необязательный аргумент: vis  –s удаляет все непечатаемые символы вместо  того, чтобы показывать их условное видимое представление. Этот параметр используется для очистки фай лов из других систем, например, применяющих в конце строки CRLF (carriage return and line feed – возврат каретки и перевод строки) вместо символа новой строки.

/*  vis:  сделать  видимыми  странные символы  (версия  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) || c==’\n’ || c==’\t’  || c==’  ‘))

putchar(c); else  if  (!strip)

printf("\\%03o",  c); exit(0);

}

Упомянутый ранее  argv  – это указатель на массив, элементами которого являются указатели на массивы символов; каждый массив завершается ASCII-символом NUL   (‘\0′), поэтому можно рассматривать такой массив как строку. Эта версия vis  начинается с проверки наличия аргументов, если  же аргумент задан, то он сравнивается с –s  (неправильные аргументы игнорируются). Функция strcmp(3) сравнивает две строки и в случае совпадения возвращает ноль.

В табл. 6.2  приведен перечень функций обработки строк и просто  полезных функций,  одной  из  которых является strcmp.  Обычно  лучше

предпочесть эти  функции, а не писать  собственные, потому что  они стандартны,  отлажены и  во многих случаях работают  быстрее,  чем то, что можно написать самостоятельно, так  как они были  оптимизированы для  конкретных машин (некоторые из них  написаны на  Ассемблере).

Упражнение 6.3.  Измените аргумент –s так,  чтобы  vis  –sn  печатала только строки из  n и более  последовательных печатаемых символов, опуская непечатаемые символы и короткие последовательности печа таемых. Таким образом можно выделить текстовые части нетекстовых файлов (например, исполняемых программ). Некоторые версии систе мы  содержат программу strings,  которая  реализует  такое решение. Что удобнее – специальная программа или аргумент для vis? ~

Упражнение 6.4.  Одной  из  сильных сторон  системы UNIX  является доступность исходного текста Си – код иллюстрирует красивые решения многих задач программирования. Выскажите свое мнение относи тельно альтернативы: удобочитаемый код Си или возможная в некоторых  случаях оптимизация за  счет  переписывания программы на  Ассемблере. ~

Таблица 6.2. Стандартные функции обработки строк

Функция

Действие

strcat(s,t) strncat(s,t,n) strcpy(s,t) strncpy(s,t,n)

strcmp(s,t) strncmp(s,t,n) strlen(s)) strchr(s,c) strrchr(s,c)

atoi(s) atof(s)

malloc(n) calloc(n,m)

free(p)

присоединяет строку t в конец строки s; возвращает s присоединяет не более чем n символов t в конец s копирует t в s; возвращает s

копирует ровно n символов; дополняет символом null при необходимости

сравнивает s и t, возвращает <0, 0,  >0  для <, ==, >

сравнивает не более n символов возвращает длину строки s

возвращает указатель к первому c в s, NULL, если его нет

возвращает указатель к последнему c в s, NULL, если  его нет.  В старых системах это были  функции index и rindex

возвращает целочисленное представление s

возвращает значение s с плавающей точкой; требует объявления double  atof()

возвращает указатель на n байт памяти, NULL, если не может возвращает указатель на n×m байт  памяти, заполняет байтом 0, возвращает NULL при неудаче, malloc и calloc возвращают char  *a

освобождает память, распределенную malloc или calloc

a        В современных реализациях Си malloc и calloc возвращают void*. – Примеч.

науч. ред.

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии