Язык программирования Си (Ритчи, Керниган) - страница 94

можно было бы написать и так:

>printf((argc › 1)? "%s ": "%s", *++argv);

Как видим, формат в printf тоже может быть выражением.

В качестве второго примера возьмем программу поиска образца, рассмотренную в параграфе 4.1, и несколько усовершенствуем ее. Если вы помните, образец для поиска мы "вмонтировали" глубоко в программу, а это, очевидно, не лучшее решение. Построим нашу программу по аналогии с grep из UNIXa, т. е. так, чтобы образец для поиска задавался первым аргументом в командной строке.

>#include ‹stdio.h›

>#include ‹string.h›

>#define MAXLINE 1000


>int getline(char *line, int max);

>/* find: печать строк с образцом, заданным 1-м аргументом */

>main(int argc, char *argv[])

>{

> char line[MAXLINE];

> int found = 0;


> if (argc != 2)

>  printf("Используйте в find образец\n");

> else

>  while (getline(line, MAXLINE) › 0)

>   if (strstr(line, argv[1]) ›= NULL) {

>    printf ("%s", line);

>    found++;

>   }

> return found;

>}

Стандартная функция strstr(s,t) возвращает указатель на первую встретившуюся строку t в строке s или NULL, если таковой в s не встретилось. Функция объявлена в заголовочном файле ‹string.h›.

Эту модель можно развивать и дальше, чтобы проиллюстрировать другие конструкции с указателями. Предположим, что мы вводим еще два необязательных аргумента. Один из них предписывает печатать все строки, кроме тех, в которых встречается образец; второй - перед каждой выводимой строкой печатать ее порядковый номер.

По общему соглашению для Си-программ в системе UNIX знак минус перед аргументом вводит необязательный признак или параметр. Так, если -x служит признаком слова "кроме", которое изменяет задание на противоположное, а -n указывает на потребность в нумерации строк, то команда

>find -x -n образец

напечатает все строки, в которых не найден указанный образец, и, кроме того, перед каждой строкой укажет ее номер.

Необязательные аргументы разрешается располагать в любом порядке, при этом лучше, чтобы остальная часть программы не зависела от числа представленных аргументов. Кроме того, пользователю было бы удобно, если бы он мог комбинировать необязательные аргументы, например так:

>find -nx образец

А теперь запишем нашу программу.

>#include ‹stdio.h›

>#include ‹string.h›

>#define MAXLINE 1000


>int getline(char *line, int max);


>/* find: печать строк образцами из 1-го аргумента */

>main(int argc, char *argv[])

>{

> char line[MAXLINE];

> long lineno = 0;

> int c, except = 0, number = 0, found = 0;


> while (--argc › 0 && (*++argv)[0] == '-')

>  while (c = *++argv[0])

>   switch (c) {

>   case 'x':

>    except = 1;

>    break;

>   case 'n':