можно было бы написать и так:
>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':