PODSTAWY INFORMATYKI 1 PRACOWNIA NR 9 TEMAT
Transkrypt
PODSTAWY INFORMATYKI 1 PRACOWNIA NR 9 TEMAT
PODSTAWY INFORMATYKI 1 PRACOWNIA NR 9 TEMAT: Programowanie w języku C/C++: łańcuchy znakowe, podstawowe funkcje biblioteczne dotyczące łańcuchów znakowych. Łańcuchy znakowe Łańcuch znaków (napis, stała napisowa) jest to ciąg złożony z zera lub większej liczby znaków zawartych między znakami cudzysłowu, np. ”napis” - znaki cudzysłowu nie są częścią napisu, określają jedynie jego granice, W rzeczywistości łańcuch znaków jest tablicą, której elementami są pojedyncze znaki (tablica elementów typu char). Ostatnim elementem tablicy jest znak o kodzie 0 (stała liczbowa 0 lub stała znakowa ’\0’), oznaczający koniec napisu. Większość funkcji standardowych języka C dodaje automatycznie na końcu ten znak. "Pies" P i e s \0 Rozmiar fizycznej pamięci przeznaczonej na napis musi być o jeden większy niż liczba znaków zawartych między znakami cudzysłowu. Deklaracja zmiennej mogącej przechowywać napis jest podobna do deklaracji zwykłej tablicy: typ zmienna[rozmiar]; char txt[20]; - deklaracja tablicy, w której można przechowywać napisy o max. długości do 19 znaków. Inicjalizacja łańcucha znaków Deklarując łańcuch znaków możemy nadać mu wartość początkową, np. char txt[10] = ”Pies”; P i e s \0 \0 \0 \0 \0 \0 pozostałym elementom tablicy przypisywana jest wartość zero To samo można uzyskać podając pojedyncze litery umieszczone w apostrofach, np. char txt[10] = {’P’,’i’,’e’,’s’}; Podstawy Informatyki 1 -1- © 2005 Jarosław Forenc Deklarując napis można nie określać jego długości, kompilator przydzieli wtedy automatycznie odpowiedni rozmiar pamięci (uwzględniając ostatni znak ’\0’), np. char *txt = ” To jest napis” ; char txt[] = ” To jest napis” ; lub W powyższy sposób można nadawać wartość łańcuchowi znaków tylko przy jego deklaracji. Błędnym zatem jest poniższy zapis: char txt[10]; txt = ” Pies” ; - taki zapis nie jest poprawny. Prawidłowy zapis wymaga wykorzystania funkcji strcpy() z pliku nagłówkowego string.h: char txt[10]; strcpy(txt,” Pies” ); Stała znakowa Stała znakowa jest to liczba całkowita. Tworzy ją jeden znak ujęty w apostrofy, np. ’x’. Wartością stałej znakowej jest wartość kodu ASCII, np. kod ASCII znak kod ASCII znak kod ASCII znak 48 49 50 ... 57 0 1 2 ... 9 65 66 67 ... 90 A B C ... Z 97 98 99 ... 122 a b c ... z Pewne znaki niegraficzne mogą być reprezentowane w stałych znakowych przez sekwencje specjalne, które wyglądają jak dwa znaki, ale reprezentują tylko jeden znak, np. ’\n’ ’\t’ ’\v’ ’\a’ ’\\’ ’\’’ ’\” ’ ’\?’ nowy wiersz tabulator poziomy tabulator pionowy alarm \ (ang. backslash) apostrof cudzysłów znak zapytania Zapis ’A’ oznacza jeden znak, natomiast zapis ” A” - dwa znaki, gdyż jest to napis kończący się znakiem ’\0’. Podstawy Informatyki 1 -2- © 2005 Jarosław Forenc Funkcje do wprowadzanie i wyprowadzanie znaków Funkcja: printf Nagłówek: int printf(const char *format,...); Do wyświetlenia łańcucha znaków używamy: %s, zaś pojedynczego znaku: %c. Funkcja scanf Nagłówek: int scanf(const char *format,...); Do wczytania łańcucha znaków używamy: %s, zaś pojedynczego znaku: %c. Funkcji scanf nie można wykorzystać do wczytania łańcucha znaków zawierającego spacje, gdyż wczytywanie zakończy się na pierwszej spacji (w takim przypadku należy wykorzystać funkcję gets). Funkcja gets Nagłówek: char *gets(char *s); Funkcja gets wczytuje wiersz (ciąg znaków zakończony ’\n’) ze strumienia stdin (klawiatura) i umieszcza w obszarze pamięci wskazywanym przez s zastępując ’\n’ znakiem ’\0’. Funkcja zwraca wskaźnik na początek wypełnianego obszaru, np. char bufor[80]; gets(bufor); Funkcja puts Nagłówek: int puts(const char *s); Funkcja puts wypisuje na stdout (ekran) zawartość łańcucha znakowego (ciąg znaków zakończony znakiem ’\0’) zastępując znak ’\0’ znakiem ’\n’. char bufor[80] = ” to jest tekst” ; puts(bufor); Funkcja getch Nagłówek: int getch(void); Funkcja getch czyta znak z klawiatury bez echa na ekranie. int znak; znak = getch(); Podstawy Informatyki 1 -3- © 2005 Jarosław Forenc Plik nagłówkowy string.h Prototyp funkcji Opis size_t strlen(const char *s); zwraca długość łańcucha znaków (nie bierze pod uwagę znaku ’\0’), char *strcpy(char *s1, const char *s2); kopiuje łańcuch s2 do łańcucha s1, char *strcat(char *s1, const char *s2); dołącza do łańcucha s1 łańcuch s2, int strcmp(const char *s1, const char *s2); porównuje łańcuchy s1 i s2 z rozróżnianiem wielkości liter, zwraca 0 gdy s1=s2, wartość mniejszą od zera, gdy s1<s2 i wartość większą od zera, gdy s1>s2, int strcmpi(const char *s1, const char *s2); działa jak strcmp, ale bez rozróżniania wielkości liter, char *strlwr(char *s); zamienia w łańcuchu s duże litery na małe, char *strrev(char *s); odwraca kolejność znaków w łańcuchu s, char *strset(char *s, int c); wypełnia łańcuch s znakiem c, przeszukuje łańcuch s1 w celu odnalezienia podłańcucha s2 zwracając wskazanie do elementu char *strstr(const char *s1, const char *s2); łańcucha s1, od którego zaczynają się znaki takie same jak w łańcuchu s2, lub NULL, gdy s2 nie występuje w s1, char *strupr(char *s); zamienia w łańcuchu s litery małe na duże. Przykład 1 #include <stdio.h> #include <string.h> int main() { char napis1[] = "tekst w buforze"; char napis2[20]; int dlugosc; } printf("napis1: %s \n",napis1); dlugosc = strlen(napis1); printf("liczba znakow w napis1: %d \n",dlugosc); strupr(napis1); printf("napis1 (duze litery): %s \n",napis1); strlwr(napis1); printf("napis1 (male litery): %s \n",napis1); strcpy(napis2,napis1); printf("napis2: %s \n",napis2); strrev(napis2); printf("napis2 (odwrocony): %s \n",napis2); return 0; Podstawy Informatyki 1 -4- © 2005 Jarosław Forenc