Temat: Operacje na łańcuchach – tablicach znaków 2. Funkcje
Transkrypt
Temat: Operacje na łańcuchach – tablicach znaków 2. Funkcje
Temat: Operacje na ła cuchach – tablicach znaków 1. Poj cie ła cucha Ła cuch to ci g znaków zako czony znakiem o kodzie zero (‘\0’). Ła cuch mo e by zapami tany w programie w stałej albo zmiennej ła cuchowej. 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 ko ca linii ) s kopiowane do zmiennej tekst i dostawiany jest znak ‘\0’ // char *tekst1=”To jest napis”; // przydział pami ci dla ła cucha tekst1 odbywa // si w trakcie przypisania. Na ko cu ła cucha dostawiany jest znak ‘\0’. T’; // bł d !!! tablica tekst ma ju przydział pami ci char tekst=' 2. Funkcje operuj ce na ła cuchach <string.h> - plik nagłówkowy zawieraj cy operacje na ła cuchach char ∗ strcpy( char *kopia, char * rodło ); kopiowanie wszystkich znaków ła cucha rodło (do znaku ‘\0’) do ła cucha kopia. Dodatkowo funkcja zwraca wska nik do pierwszego znaku ła cucha kopia. Przykład 2 char str1[10]; char *str2 = „abc”; strcpy(str1, str2); printf("%s\n", str1); printf("%s\n",strcpy(str1,"ABCD")); Uwaga !!! Nale y zadba o to, aby ła cuch ródło miał znak ‘\0’ na ko cu. 1 Nale y zadba o to, aby ła cuch kopia był odpowiednio długi, aby pomie ci wszystkie znaki ła cucha ródło int strcmp ( char ∗tekst_1, char ∗tekst_2 ) funkcja zwraca warto : < 0 =0 >0 gdy gdy gdy tekst_1 < tekst_2 tekst_1 == tekst_2 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) ła cucha 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 ła cuch ródło do ła cucha kopia. Zwraca wska nik na poł czony ła cuch 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 wyst pienia znaku c w podanym ła cuchu s Zwraca wska nik na znalezion pozycj wyst pienia 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 wyst pienia znaku c w podanym ła cuchu s Zwraca wska nik na znalezion pozycj wyst pienia 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 wyst pienia ła cucha sub w podanym ła cuchu s Zwraca wska nik na znalezion pozycj wyst pienia 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 ła cucha s na du e litery Przykład 9 char *string = "abcde89fgh***ijKLMnopqrstuvwxyz", *ptr; //ptr = strupr(string); printf("%s\n", strupr(string)); char∗ strlwr( char ∗s ) Funkcja zamienia zawarto ła cucha s na małe litery Przykład 10 char *string = "Dev C++"; strlwr(string); printf("%s\n", string); 4 3. Przykład programu przetwarzaj cego ła cuchy 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 wypisuj ca nazwiska osób zaczynaj cych 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