ANSI C 9

ANSI C 9



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


Wyszukiwarka

Podobne podstrony:
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 -------- ten program tak, aby najlepiej wykorzystywał dostępną mu p
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 8 5 WSKAŹNIKI I TABLICE Między nazwą tablicy a wskaźnikiem jest jednak istotna różnica, o k
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 8 5 WSKAŹNIKI I TABLICE ____________— for (i = 1; i < argc; i-H-) printf(,,%s%s”, argv[i
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
ANSI C 3 5 WSKAŹNIKI I TABLICE__-— --- konstrukcja *pfa[] zostanie rozpoznana jako deklarator, a z

więcej podobnych podstron