5 WSKAŹNIK! I TABLICE ________—
A oto program:
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
int getline(char *line, int max);
/* find: wypisz wiersze pasujące do wzorca z 1. obowiązkowego arg. */ main(int argc, char *argv[ ])
char line[MAXLINE];
long lineno = 0;
int c, except = 0, number = 0, found = 0;
while (--argc > 0 && (*++argv)[0l == ’-’)
while (c = *++argv[0]) switch (c) { case ’x’: except = 1; break; case ’n’: number = 1; break; default:
printf(”find: nieznana opcja %c\n”, c); argc = 0; found = -1; break;
if (argc != 1)
printf(”Format wywołania: find -x -n wzorzec\n”);
else
while (getline(line, MAXLINE) > 0) { lineno-H-;
if ((strstr(line, *argv) != NULL) != except) { if (number)
printf(”%ld:”, lineno); printf("%s”, linę); found ++;
return found;
puwtM cu by
każdym
wartość cirge OKresIa
b.iu AHGUMENTY WYWOŁANIA PROGRAMU __
Licznik argc zmniejsza się, a wskaźnik argv zwiększa przed argumentem. Jeżeli nie było błędów, to po zakończeniu pętli liczbę argumentów, których jeszcze nie opracowano, a argv wskazuje na pierwszy z nich. Wobec tego licznik argc powinien być równy 1, a wskaźnik *argv powinien wskazywać na wzorzec. Zwróć uwagę, że *++argv jest wskaźnikiem do argumentu, a zatem (*++argv)[0] jest pierwszym znakiem tego argumentu. Nawiasy okrągłe są niezbędne, gdyż nawiasy kwadratowe tablicy fi wiążą silniej niż operator adresu * i operator zwiększania ++. Bez tych nawiasów wyrażenie byłoby równoważne z wyrażeniem *++(argv[0]). Właśnie tego wyrażenia użyliśmy w wewnętrznej pętli, której zadanie polega na maszerowaniu wzdłuż określonego ciągu znaków. W wewnętrznej . pętli wyrażenie *-H-argv[01 zwiększa wskaźnik argv[0]!
Rzadko kiedy używa się bardziej skomplikowanych wyrażeń wskaźnikowych niż zaprezentowane; w takich przypadkach lepiej jest je podzielić na dwa lub trzy kroki.
Ćwiczenie 5.10. Napisz program expr obliczający wartość wyrażenia w Odwrotnej Notacji Polskiej, podanego w poleceniu wywołania programu: każdy operator lub operand jest oddzielnym argumentem wywołania. Na przykład polecenie
expr 2 3 4 + *
oblicza wartość 2x(3+4).
Ćwiczenie 5.11. Zmień programy entab i detab (napisane jako ćwiczenia w rozdz. 1) tak, aby argumentami ich wywołania mogły być listy punktów ta-bulacyjnych. Zastosuj domyślne punkty tabulacyjne, jeżeli nie podano argumentów.
Ćwiczenie 5.12. Rozbuduj programy entab i detab, aby akceptowały skrót entab —m +n
oznaczający punkty tabulacyjne co n kolumn, poczynając od kolumny m. Wybierz dogodny (dla użytkownika) sposób postępowania programu w przypadku - niekompletnej listy argumentów.
Ćwiczenie 5.13. Napisz program taił wypisujący n ostatnich wierszy tekstu podanego na wejściu. Niech n będzie domyślnie równe 10, ale tę wartość można zmienić za pomocą opcjonalnego argumentu wywołania programu. Zatem zlecenie
taił -n
spowoduje wypisanie n ostatnich wierszy. Program powinien działać sensownie niezależnie od tego, jak nierozsądne są dane wejściowe lub wartość n. Napisz
11 " Język ANSI C 161