5 WSKAŹNIKI I TABLICE ____________—
for (i = 1; i < argc; i-H-)
printf(,,%s%s”, argv[i], (i < argc-1) ? " ” : ””)• printf (”\n”); return 0;
Zmienna argv jest wskaźnikiem do tablicy wskaźników, a więc - zamiast indeksowy tę tablicę - możemy posłużyć się wskaźnikami. Następny wariant programu polega^ zwiększaniu argv, którą potraktowano jako wskaźnik do wskaźnika do znaków, oraz na zmniejszaniu argc:
#include <stdio.h>
/* echo argumentów wywołania; wersja 2 */ main(int argc, char *argv[])
while (—argc > 0)
printf(”%s%s”, *++argv, (argc > 1) ? ” " : MM); printf(”\n”); return 0;
Zmienna argv jest wskaźnikiem do początku tablicy tekstów argumentów wywołania, a zatem zwiększając ją o jeden (++argv) sprawiamy, że wskazuje na oryginalr pierwszy argument argv[1], a nie na argv[0]. Każde następne zwiększenie przesuwa ten wskaźnik do kolejnego argumentu; *argv jest wskaźnikiem do znaków tworzących ten argument. W tym samym czasie jest zmniejszany licznik argc; gdy stanie się zerem, będzie to oznaczać, że nie ma już więcej argumentów do wypisania.
Wywołanie funkcji printf moglibyśmy napisać jeszcze inaczej:
printf((argc > 1) ? ”%s ” : ł,%s”, *++argv);
co pokazuje, że argument opisujący format w funkcji printf może także być wyrażeniem
Drugim przykładem niech będzie ulepszona wersja programu wyszukiwania wiersz) zawierających wzorzec, opisanego w p. 4.1. Jak pamiętamy, wzorzec wyszukiwania był ukryty głęboko w programie, co zupełnie nas nie zadowalało. Opierając się na pochodzą cym z systemu Unix programie grep zmienimy nasz program tak, aby wzorzec wyszuki wania był podawany jako pierwszy argument w poleceniu wywołania programu.
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
int getline(char *line, int max);
5.10 ARGUMENTY WYWOŁANIA PROGRAMU _
powered by
Mi si ol
/* find: wypisz wiersze pasujące do wzorca z 1. argumentu */ main(int argc, char *argv[ ])
char line[MAXLINE]; int found = 0;
if (argc != 2)
printf(”Format wywołania: find wzorzec\n”); else
while (getline(line, MAXLINE) > 0) if (strstr(line, argv[1 ]) != NULL) { printf(”%s", linę);
found++;
/
return found;
Pochodząca z biblioteki standardowej funkcja strstr(s,t) zwraca wskaźnik do pierwszego wystąpienia tekstu z t w s albo NULL, jeśli tekst t nie wystąpił w s. Jest ona zadeklarowana w nagłówku <string.h>.
Przerabiając dalej nasz model programu, możemy zaprezentować następne konstrukcje zawierające wskaźniki. Przypuśćmy, że wywołanie programu chcemy uzupełnić dwoma nieobowiązkowymi argumentami. Jeden mówi „wypisz wszystkie wiersze z wyjątkiem tych, które pasują do wzorca”, a drugi - „poprzedź każdy wypisany wiersz jego numerem”.
Ogólna konwencja w systemie Unix dla programów napisanych w C mówi, że argument wywołania rozpoczynający się znakiem minus wprowadza nieobowiązkowy sygnalizator lub parametr programu, czyli opcję. Jeżeli przyjmiemy, że -x (od ang. except: oprócz) oznacza sygnalizowanie odwrotnego działania programu, a -n (od ang. number: numer) oznacza żądanie numerowania wierszy, to polecenie
find —x -n wzorzec
spowoduje wypisanie każdego wiersza, który nie pasuje do wzorca, poprzedzonego swoim numerem wiersza. W programie należy przewidzieć możliwość podawania opcji w dowolnej kolejności, a właściwa część programu nie powinna zależeć od liczby podanych argumentów. Ponadto dużą wygodą dla użytkowników byłaby możliwość grupowania opcji, jak na przykład
find -nx wzorzec
159