Аргументи програми: vis, версія 2

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

Щоб пояснити, як відбувається обробка аргументів, давайте вимірюв ним програму vis, додавши необовязковий аргумент: vis-s видаляє всі недруковані символи замість того, щоб показувати їх умовне видиме представлення Цей параметр використовується для очищення фай лов з інших систем, наприклад, що застосовують в кінці рядка CRLF (carriage return and line feed – повернення каретки і переведення рядка) замість символу нового рядка

/ * Vis: зробити видимими дивні символи (версія 2) * /

#include &ltstdioh&gt

#include &ltctypeh&gt

main(argc,  argv) int  argc

char  *argv[]

{

int c, strip = 0

if  (argc &gt 1 &amp&amp  strcmp(argv[1],  &quot–s&quot) == 0) strip = 1

while  ((c  =  getchar())  =  EOF) if  (isascii(c)  &amp&amp

(isprint(c) || c==\n || c==\t  || c==  ))

putchar(c) else  if  (strip)

printf(&quot\\%03o&quot,  c) exit(0)

}

Згаданий раніше argv – це покажчик на масив, елементами якого є покажчики на масиви символів кожен масив завершується ASCII-символом NUL (\ 0), тому можна розглядати такий масив як рядок Ця версія vis починається з перевірки наявності аргументів, якщо ж аргумент заданий, то він порівнюється з-s (неправильні аргументи ігноруються) Функція strcmp (3) порівнює два рядки і в разі збігу повертає нуль

У табл 62 наведено перелік функцій обробки рядків і просто корисних функцій, однією з яких є strcmp Звичайно краще

віддати перевагу ці функції, а не писати власні, бо вони стандартні, налагоджені і в багатьох випадках працюють швидше, ніж те, що можна написати самостійно, так як вони були оптимізовані для конкретних машин (деякі з них написані на Асемблері)

Вправа 63Змініть аргумент-s так, щоб vis-sn  друкувала тільки рядки зn і більше послідовних друкованих символів, опускаючи недруковані символи і короткі послідовності печа танемо Таким чином можна виділити текстові частини нетекстових файлів (наприклад, виконуваних програм) Деякі версії систе ми містять програму strings, яка реалізує таке рішення Що зручніше – спеціальна програма або аргумент для vis ~

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

Таблиця 62 Стандартні функції обробки рядків

Функція

Дія

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 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*