====== Znaki i łańcuchy znaków (stringi) ===== ===== Funkcja getchar() ===== Przykład (program cat) #include int main() { int a; while((a=getchar()) != EOF) putchar(a); return 0; } **Ćwiczenia** * zmodyfikuj powyższy program tak aby po każdej linii tekstu wyświetlał ilość znaków wczytanych w tej linii * wykorzystując funkcję **[[http://pl.wikibooks.org/wiki/C/getchar|getchar()]]** napisz funkcję o nazwie **czytajlinie**, która wczytuje pojedynczą linię tekstu z klawiatury i umieszcza ją w tablicy w postaci łańcucha znakowego (ciągu znaków zakończonego wartością 0). Argumentami funkcji są: tablica oraz jej rozmiar. Funkcja zwraca wskaźnik do tablicy zawierającej wczytany łańcuch znakowy. Jeżeli długość linii tekstu przekracza rozmiar tablicy wówczas funkcja umieszcza w tablicy tylko tyle znaków ile jest w stanie pomieścić w tablicy. Deklarację funkcji zawrzyj w pliku **str.h** a definicję w pliku źródłowym **str.c**. * napisz funkcję **dlugosc**, która zwraca ilość znaków z podanego łańcucha znakowego. Deklarację i definicję dodaj do odpowiednich plików źródłowych i nagłówkowych. * napisz funkcję **''kopia''**, która tworzy kopię łańcucha znaków. Funkcja przyjmuje dwa argumenty: tablicę znaków do skopiowanie oraz tablicę znaków do której napis zostanie skopiowany. Funkcja zwraca wskaźnik do skopiowanego napisu. * napisz funkcję ''**malenaduze**'', która dla podanej tablicy znaków zamieni wszystkie małe litery na duże. Funkcja zwraca wskaźnik na początek przetransformowanej tablicy. * napisz funkcję **''sklej''**, której argumentami są dwie tablice ze znakami. Funkcja dokleja zawartość drugiej tablicy na końcu pierwszej (zakładamy, że ta tablica jest dostatecznie duża aby pomieścić oba napisy). Wartością zwracaną jest wskaźnik do tablicy zawierającej połączone napisy. * napisz funkcję **porownaj**, której argumentami są dwa łańcuchy znaków. Funkcja zwraca wartość 1 gdy oba napisy są identyczne. W przeciwnym wypadku zwracana jest wartość 0. \\ Np. wywołanie porownaj("Ala ma kota","Ala ma kota") zwraca 1, zaś porownaj("Ala ma kota","ala ma kota") zwraca wartość 0. ===== Argumenty funkcji main() ===== #include #define MAX 1000 int main(int argc,char *argv[]) { int i=0; while(i< argc) { printf("argument %d ",i); printf(*(argv+i)); printf("\n"); i++; } return 0; } **Ćwiczenia** * napisz program program **tabliczka** wyświetlający tabliczkę mnożenia. \\ Program obsługuje następujące opcje: * ''-h'' wyświetla krótką pomoc wyjaśniającą obsługę programu, możliwe opcje oraz autora programu. * ''-n liczba'' wyświetla tabliczkę mnożenia z zakresu od 1 do podanej po argumencie ''-n'' liczby calkowitej. Do zamiany łańcucha znakowego do postaci liczby całkowitej wykorzystaj funkcję [[http://pl.wikibooks.org/wiki/C/atoi|atoi]]. * domyślnie (gdy nie podano żadnej opcji) wyświetlana jest tabliczka mnożenia 10x10. * korzystając z funkcji **znajdz** napisz program ''grep.c'' który wyświetla linie tekstu zawierające podany wzorzec. Argumentem programu jest szukany wzorzec (ciąg znaków). W przypadku gdy argument nie został podany lub gdy została podana opcja ''**-h**'' program wyświetla krótką informację pomocniczą. Program czyta kolejne linie tekstu i wyświetla tylko te które zawierają wzorzec. * dodaj do programu ''grep.c'' opcję ''**-v**'' która powoduje, że program wyświetla wyłącznie linie nie zawierające wzorca * dodaj do programu ''grep.c'' opcję ''**-i**'' która powoduje, że dopasowanie wzorca nie zwraca uwagi na wielkość liter, tzn. wzorzec "ala" jest równoważny "Ala", "ALA", "aLA", itd. W przypadku czytania ze standardowego wejścia (klawiatury) koniec pliku można wykryć za pomocą ''**foef(stdin)**''. Funkcja ''**feof()**'' dla podanego wskaźnika do pliku () zwraca wartość całkowitą 1 gdy dotarliśmy do końca pliku oraz wartość 0 gdy koniec pliku nie został osiągnięty. Przykłady: ./grep -h Program grep wypisuje linie tekstu pasujace do wzorca. Uzycie: grep [-i] [-v] wzorzec ./grep wzorzec < plik_wejsiowy ./grep -v wzrzec < plik_wejsciowy ./grep -i wzorzec < plik ./grep -i -v wzorec < plik ===== Zadanie domowe ===== * napisz program, który po wczytaniu tekstu wyświetli liczbę linii, wyrazów i znaków. Jako wyrazy traktujemy ciąg znaków oddzielony przynajmniej jednym białym znakiem (spacją, tabulatorem lub znakiem nowej linii). Gdy program zostanie uruchomiony z opcją ''**-l**'' wyświetlana powinna być tylko liczba linii wczytanego tekstu. Z opcją ''**-w**'' tylko liczba wyrazów a z opcją ''**-z**'' tylko liczba znaków (zobacz program ''**wc**'' w systemie UNIX/Linux). * napisz funkcję **znajdz**, która poszukuje podciągu w łańcuchu znakowym. Dla danego napisu A oraz pewnego ciągu znaków B funkcja zwraca pierwsze wystąpienie wzoru B w napisie A, tzn. zwracany jest adres elementu tablicy A rozpoczynającego dopasowany wzorzec. Np. wywołanie znajdz("Ala ma kota","kot") zwraca adres znaku 'k' z napisu danego w pierwszym argumencie. Jeżeli podciąg B nie występuje w A to zwracana jest wartość NULL. * korzystając z funkcji **[[http://pl.wikibooks.org/wiki/C/strcmp|strcmp]]** napisz program, który dla podanego tekstu wyświetli wszystkie linie w porządku alfabetycznym. Zakładamy, że podany tekst nie posiada więcej niż 1000 linii.