Temat: Operacje na łacuchach tablicach znaków 1. Pojcie łacucha Łacuch to cig znaków zakoczony znakiem o kodzie zero ( \0 ). Łacuch moe by zapamitany w programie w stałej albo zmiennej łacuchowej. Przykład 1 char tekst[100]; // 100-elementowa tablica znakow scanf( %s,tekst); //znaki podane z klawiatury (do pierwszego białego znaku ) //s kopiowane do zmiennej tekst i dostawiany jest znak \0 gets(tekst); //znaki podane z klawiatury (do znaku koca linii ) s // kopiowane do zmiennej tekst i dostawiany jest znak \0 char *tekst1= To jest napis ; // przydział pamici dla łacucha tekst1 odbywa // si w trakcie przypisania. Na kocu łacucha dostawiany jest znak \0. char tekst='t ; // błd!!! tablica tekst ma ju przydział pamici 2. Funkcje operujce na łacuchach <string.h> - plik nagłówkowy zawierajcy operacje na łacuchach char strcpy( char *kopia, char *rodło ); kopiowanie wszystkich znaków łacucha rodło (do znaku \0 ) do łacucha kopia. Dodatkowo funkcja zwraca wskanik do pierwszego znaku łacucha kopia. Przykład 2 char str1[10]; char *str2 = abc ; strcpy(str1, str2); printf("%s\n", str1); printf("%s\n",strcpy(str1,"abcd")); Uwaga!!! Naley zadba o to, aby łacuch ródło miał znak \0 na kocu. 1
Naley zadba o to, aby łacuch kopia był odpowiednio długi, aby pomieci wszystkie znaki łacucha ródło int strcmp ( char tekst_1, char tekst_2 ) funkcja zwraca warto: < 0 gdy tekst_1 < tekst_2 = 0 gdy tekst_1 == tekst_2 > 0 gdy tekst_1 > tekst_2 Przykład 3 char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc"; int wynik; wynik = strcmp(buf2, buf1); if (wynik > 0) printf("napis buf2 jest wiekszy niz buf1\n"); else printf("napis buf2 jest mniejszy niz buf1\n"); wynik = strcmp(buf2, buf3); if (wynik> 0) printf("napis buf2 jest wiekszy niz buf3\n"); else printf("napis buf2 jest mniejszy niz buf3\n"); unsigned strlen(char s ) Funkcja wyznacza i zwraca długo (ilo znaków) łacucha s (bez znaku \0 ) Przykład 4 char *tekst="jak dlugi jest to napis"; printf("dlugosc napisu %s : %d\n",tekst,strlen(tekst)); char strcat( char kopia, char ródło ) Funkcja dodaje łacuch ródło do łacucha kopia. Zwraca wskanik na połczony łacuch kopia. 2
Przykład 5 char cel[25]; char *spacja = " ", *c = "C++", *st = "Dev "; strcpy(cel, st); strcat(cel, spacja); printf("%s\n", strcat(cel, c)); char strchr(char s, int c ) Funkcja szuka pierwszego wystpienia znaku c w podanym łacuchu s Zwraca wskanik na znalezion pozycj wystpienia lub adres NULL. Przykład 6 char string[17]; char *ptr, c = ' ; strcpy(string, "To jest poczatek"); ptr = strchr(string, c); if (ptr) printf("znak %c wystepuje na pozycji: %d\n", c, ptr-string); else printf("znaku nie znaleziono\n"); char strrchr( char s, int c ) Funkcja szuka ostatniego wystpienia znaku c w podanym łacuchu s Zwraca wskanik na znalezion pozycj wystpienia lub adres NULL. Przykład 7 char string[15]; char *ptr, c = 'r'; strcpy(string, "To jest napis"); ptr = strrchr(string, c); if (ptr) printf("znak %c wystepuje na pozycji: %d\n", c, ptr-string); else printf("znak nie wystepuje\n"); char strstr( char s, char sub ) Funkcja szuka pierwszego wystpienia łacucha sub w podanym łacuchu s Zwraca wskanik na znalezion pozycj wystpienia lub adres NULL. 3
Przykład 8 char *str1 = "Dev C++", *str2 = "C++", *ptr; ptr = strstr(str1, str2); printf("podstring: %s wystepuje na pozycji %d\n", ptr,ptr-str1); char strupr( char s ) Funkcja zamienia zawarto łacucha s na due litery Przykład 9 char *string = "abcde89fgh***ijklmnopqrstuvwxyz", *ptr; //ptr = strupr(string); printf("%s\n", strupr(string)); char strlwr( char s ) Funkcja zamienia zawarto łacucha s na małe litery Przykład 10 char *string = "Dev C++"; strlwr(string); printf("%s\n", string); 4
3. Przykład programu przetwarzajcego łacuchy Przykład 11 #include <conio.h> #include <stdio.h> #include <string.h> char miesiace[12][14]; // miesiace - tablica dwunastu stałych napisów struct Pracownik char nazwisko[40]; float zarobki[12]; ; // funkcja do wczytywania danych typu Pracownik void wczytaj_dane(pracownik *P,int *ile) printf("nazwisko:"); scanf("%s",p[*ile].nazwisko); //strupr(p[*ile].nazwisko); for (int i=0;i<12;i++) printf("%s:",miesiace[i]); scanf("%f",&p[*ile].zarobki[i]); (*ile)++; // funkcja wypisujca nazwiska osób zaczynajcych si napisem pocz void wypisz_osoby(pracownik *P,int ile,char *pocz) char *pomoc,bufor[40],bufor1[40]; strcpy(bufor1,pocz); for (int i=0;i<ile;i++) strcpy(bufor,p[i].nazwisko); pomoc=strstr(strupr(bufor),strupr(bufor1)); if (pomoc!=null && pomoc==bufor1) printf("%s\n",p[i].nazwisko); 5
int main( ) #define n 100 Pracownik P[n]; int ile=0; for (int i=1;i<=3;i++) wczytaj_dane(p,&ile); char pocz[4]; printf("podaj trzy pierwsze litery nazwiska :"); scanf("%s",pocz); wypisz_osoby(p,ile,pocz); getch(); return 0; 6