1 ELEMENTARZ
odpowiedni parametr jako wskaźnik i za jego pomocą pośrednio odwoływać się do tej zmiennej. Wskaźniki opiszemy szczegółowo w rozdz. 5.
Z tablicami jest inaczej. Gdy argumentem wywołania funkcji jest nazwa tablicy, wówczas przekazywaną wartością jest położenie (inaczej adres) początku tablicy; elementy tablicy nie są kopiowane. Przez indeksowanie tej wartości funkcja ma dostęp - a więc i możliwość zmiany - do wartości dowolnego elementu tablicy. Jest to tematem następnego punktu.
łWInMM
I
Tablice znakowe
Najczęściej używanymi tablicami w języku C są tablice znaków. Aby pokazać sposób korzystania z tych tablic oraz funkcje manipulujące nimi, napiszmy program, który czyta zbiór wierszy i wypisuje najdłuższy. Schemat problemu jest dość prosty: (
while (istnieje inny wiersz)
if (Jest dłuższy od poprzednio najdłuższego) zachowaj go zachowaj jego długość wypisz najdłuższy wiersz
Ze schematu jasno wynika, że program w naturalny sposób dzieli się na części. W jednej z nich jest czytany nowy wiersz, w innej sprawdza się jego długość, w jeszcze innej zachowuje wiersz, reszta zaś steruje całym procesem.
Problem dał się ładnie podzielić na zadania, dobrze byłoby więc napisać prograiD w ten sam sposób. Napiszmy zatem najpierw oddzielną funkcję getline, pobierając^ z wejścia następny wiersz. Spróbujemy napisać ją tak, aby mogła być używana w in-nych programach. Jako minimum funkcja getline musi zwracać sygnał o napotkaniu końca pliku. Bardziej pożyteczne byłoby zwracanie długości wiersza lub zera po\ osiągnięciu końca pliku. Można zaakceptować zero jako sygnał końca pliku, nie jest ono bowiem nigdy poprawną długością wiersza. Każdy wiersz zawiera co najmniej | jeden znak; nawet wiersz składający się tylko ze znaku nowego wiersza ma długość !•
Po stwierdzeniu, że dany wiersz jest dłuższy od poprzednio najdłuższego, należy gc| gdzieś zapamiętać. Sugeruje to utworzenie funkcji copy przepisującej nowy wiers/j w bezpieczne miejsce. i
Ponadto jest potrzebny program sterujący funkcjami getline i copy. Oto wynik naszych rozważań.
1.9 TABLICE ZNAKOWE____
powered by
Mi si ol
#include <stdio.h>
#define MAXLINE 1000 /* maksymalny rozmiar wiersza */
int getline(char line[], int maxline); void copy(char to[ ], char from[ ]);
I* wypisz najdłuższy wiersz */ main()
int len; /* długość bieżącego wiersza */
int max; /* poprzednia maks. długość */
char line[MAXLINE]; /* bieżący wiersz z wejścia */ char longest[MAXLINE]; /* przechowywany maks. wiersz */
max = 0;
while ((len = getline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, linę);
if (max > 0) /* znaleziono wiersz */
printf(”%s”, longest); return 0;
/* getline: wczytaj wiersz do s, podaj jego długość */ int getline(char s[], int lim)
int c, i;
for (i = 0; klim—1 && (c = getchar()) != EOF && c != ’\n’; ++i) s[i] = c; if (c == ’\n’) { s[i] = c;
++i;
s[i] = ’\0’; return i;
53