ANSI C 8

ANSI C 8



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


Wyszukiwarka

Podobne podstrony:
ANSI C 8 5 WSKAŹNIKI I TABLICE Między nazwą tablicy a wskaźnikiem jest jednak istotna różnica, o k
Instrukcja AX up by dunaj2 8 Wskaźniki tablicy rozdzielczej * - 123
ANSI C 4 WSKAŹNIKI I TABLICE Wskaźnik jest zmienną, która zawiera adres innej zmiennej. W języku C
ANSI C 5 5 WSKAŹNIKI I TABLICE Jeżeli wskaźnik ip wskazuje na zmienną całkowitą x, to *ip może wys
ANSI C 6 5 WSKAŹNIKI I TABLICE _ Obrazowo wygląda to tak: 5 2 WSKAŹNIKI I ARGUMENTY FUNKCJI w miej
ANSI C 7 5 WSKAŹNIKI I TABLICE Ćwiczenie 5.1. Tak jak została napisana, funkcja getint traktuje zn
ANSI C 9 5 WSKAŹNIKI I TABLICE______—-- alloc i afree jest stosem lub listą LIFO (ang. last-in, fi
ANSI C 0 5 WSKAŹNIKI I TABLICE o specjalną wartość wskaźnikową. Stała NULL jest zdefiniowana w
ANSI C 1 5 WSKAŹNIKI I TABLICE Stałe napisowe chyba najczęściej występują jako argumenty funkcji,
ANSI C 2 5 WSKAŹNIKI I TABLICE _______^ operator przyrostkowy ++ nie zmieni t, dopóki nie zostanie
ANSI C 3 5 WSKAŹNIKI I TABLICE możliwości są zawarte w funkcjach: getline (rozdz. 1 i 4), atoi, it
ANSI C 4 5 WSKAŹNIKI I TABLICE #define MAXLEN 1000 /* maks. długość wiersza wejściowego */ int get
ANSI C 5 5 WSKAŹNIKI I TABLICE /* swap: zamień miejscami v[i] i v[j] */ void swap(char *v[], int i
ANSI C 6 5 WSKAŹNIKI I TABLICE_______—- Oprócz tej różnicy w zapisie tablicę dwuwymiarową traktuj
ANSI C 7 5 WSKAŹNIKI I TABLICE oba zapisy a[3][4] i b[31[4] są poprawnymi odwołaniami do pojedyncz
ANSI C 9 5 WSKAŹNIK! I TABLICE ________— A oto program: #include <stdio.h> #include
ANSI C 0 5 WSKAŹNIKI I TABLICE -------- ten program tak, aby najlepiej wykorzystywał dostępną mu p
ANSI C 1 5 WSKAŹNIKI I TABLICE------- if (left >= right) /* nic nie rób, jeśli tablica zawiera
ANSI C 2 5 WSKAŹNIKI I TABLICE _______—— Ćwiczenie 5.16. Dodaj opcję -d (kolejność słownikowa) spr

więcej podobnych podstron