W07 teksty-tablice znakowe, PWR - Informatyka W4, podstawy programowania
[ Pobierz całość w formacie PDF ]
DANE TEKSTOWE W J Ę ZYKU C - TABLICE ZNAKOWE Stała tekstowa / łańcuchowa jest tablicą znaków zakończoną znakiem o kodzie: 0 np. stała łańcuchowa: ”Jestem tekstem” ASCII ® . . . ’J’ ’e’ ’s’ ’t’ ’e’ ’m’ ’ ’ ’t’ ’e’ ’k’ ’s’ ’t’ ’e’ ’m’ ’\0’ . . . warto ś ci ® . . . 74 101 115 116 101 109 32 116 101 107 115 116 101 109 0 . . . adresy ® 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Definicje i inicjalizacje zmiennych „tekstowych”: char tekst[ ] = { ’J’, ’e ’, ’s ’, ’t ’, ’e ’, ’m ’, ’ ’, ’t ’, ’e ’, ’k ’, ’s ’, ’t ’, ’e ’, ’m ’, ’\0’ }; char tekst2[ ] = { ”Jestem tekstem” }; char tekst3[ ] = ”Jestem tekstem”; char tekst4[100] = ”Jestem tekstem”; tekst5; // wska ź nik na znak == wska ź nik na pocz ą tek ła ń cucha znaków tekst5 = ”Jestem tekstem” ; // przypisanie zmiennej tekst5 adresu stałej tekstowej * tekst5 = tekst4 ; // poprawne przypisanie adresu tablicy char tekst6[100]; // 100-elementowa tablica znakow tekst6 = ”Jestem tekstem” ; // bł ę dne przypisanie !!! memcpy( tekst6, ”Jestem tekstem”, 15 ); // poprawne przypisanie strcpy ( tekst6, ”Jestem tekstem” ); // poprawne przypisanie Przykładowe operacje na pojedynczych literach tekstu: tekst[1] = ’E’; // zamiana drugiej litery na du Ŝą tekst[2] = tekst[2] – 32; // zamiana trzeciej litery na du Ŝą (?) tekst[3] = toupper( tekst[3] ); // zamiana czwartej litery na du Ŝą for( int i=4; i<10; i++) tekst[ i ] = toupper( tekst[ i ] ); // zamiana kolejnych sze ś ciu liter tekst[5] = ’\0’; // skrócenie tekstu do 5 liter for( int i=0; tekst[ i ] != ’\0’ ; i++) cout << tekst[ i ]; // wydrukowanie zawarto ś ci tekstu (1) for( char * wsk=tekst; *wsk ; wsk++) cout << *wsk; // wydrukowanie zawarto ś ci tekstu (2) M. Piasecki, JĘZYKI PROGRAMOWANIA 1 str. 1 (W7) Dane tekstowe - tablice znaków char Przykład przetwarzania tekstów ® dodanie rozszerzenia „ *.txt ” na końcu nazwy pliku #include <iostream.h> void main(void) { char nazwa[100]; cout << ” Podaj nazwe pliku: ”; cin.getline(nazwa,100); for(i=0; nazwa[i] != ’\0’; i++) if( nazwa[i] == ’.’) poz_kropki=i; // sprawdzenie obecno ś ci rozszerzenia txt bool jest_txt=false; if(poz_kropki!=-1) if( nazwa[poz_kropki+1]==’t’ && nazwa[poz_kropki+2]==’x’ && nazwa[poz_kropki+3]==’t’ && nazwa[poz_kropki+4]==’\0’ ) jest_txt=true; // je Ŝ eli nie ma rozszerzenia ".txt" to dopisujemy je na ko ń cu nazwy if( !jest_txt ) { nazwa[i+0] = ’.’; // zmienna ' i ' nadal wskazuje koniec nazwy nazwa[i+1] = ’t’; nazwa[i+2] = ’x’; nazwa[i+3] = ’t’; nazwa[i+4] = ’\0’; } // // To samo co powy Ŝ ej, ale z wykorzystaniem gotowych funkcji <string.h> // char* poz_kropki= strrchr (nazwa,'.'); // bool jest_txt=false; // if( poz_kropki && strcmp ( poz_kropki,".txt" )==0 ) // jest_txt=true; // if( !jest_txt ) // strcat (nazwa,".txt"); // wy ś wietlenie wyniku – nazwy z rozszerzeniem txt na ko ń cu cout << endl << endl; cout << ” Nazwa z rozszerzeniem \”txt\” = [ ” << nazwa << ” ] ”; cout << ” Nacisnij ENTER, aby zakonczyc program ”; cin.get(); } M. Piasecki, JĘZYKI PROGRAMOWANIA 1 str. 2 (W7) Dane tekstowe - tablice znaków // poszukiwanie ostatniej kropki w ła ń cuchu int i, poz_kropki=-1; Funkcje operuj ą ce na ła ń cuchach znaków <string.h> Funkcja kopiowania zawartości jednej tablicy znakowej do drugiej (ang. „ str ing c o py ”). Prototyp: char *strcpy( char *dest, const char *src); // przykładowa implementacja (z wykorzystaniem zapisu „indeksowego”) char * strcpy( char tekst_wyj[ ], char tekst_wej[ ] ) { int i = 0; while ( ( tekst_wyj[ i ] = tekst_wej[ i ] ) != ‘\0’ ) i++; return ( tekst_wyj ); } // kopiowanie jednego ła ń cucha do drugiego ® wersja wska ź nikowa (1) char * strcpy ( char * tekst_wyj, char * tekst_wej ) pocz=tekst_wyj; while ( ( * * tekst_wyj = * tekst_wej ) != ‘\0’ ) { tekst_wyj++; tekst_wej++; } return ( pocz ); } // funkcja kopiuj ą ca ła ń cuchy - wersja wska ź nikowa (2) char * strcpy ( char * tekst_wyj, char *tekst_wej ) pocz=tekst_wyj; while ( * * tekst_wyj++ = * tekst_wej++ ) ; return ( pocz ); } // kopiowanie, z ograniczeniem długo ś ci kopiowanego ła ń cucha char * str n cpy ( char tekst_wyj[ ], char tekst_wej[ ], unsigned maks_dlugosc ) { int i = 0; while ( ( tekst_wyj[ i ] = tekst_wej[ i ] ) != ‘\0’ && i < maks_dlugosc ) i++; return ( tekst_wyj ); } M. Piasecki, JĘZYKI PROGRAMOWANIA 1 str. 3 (W7) Dane tekstowe - tablice znaków { char { char Funkcja porównująca teksty: int strcmp ( char * tekst_1, char * tekst_2 ) ( ang. „ str ing c o mp are” ) funkcja zwraca wartość: < 0 gdy tekst_1 < tekst_2 = 0 gdy tekst_1 == tekst_2 > 0 gdy tekst_1 > tekst_2 int strcmp ( char tekst_1[ ], char tekst_2[ ] ) // wersja tablicowa { int i = 0; while ( tekst_1[ i ] == tekst_2[ i ] ) if ( tekst_1[ i++ ] == ‘\0’ ) return ( 0 ); return ( tekst_1[ i ] - tekst_2[ i ] ); } int strcmp ( char * tekst_1, char * tekst_2 ) // wersja wska ź nikowa (1) { while ( * tekst_1 == * tekst_2 ) { if ( tekst_1 == ‘\0’ ) return ( 0 ); tekst_1 = tekst_1 + 1; tekst_2 = tekst_2 + 1 ; } return ( * * tekst_1 - * tekst_2 ); } int strcmp ( char * tekst_1, char * tekst_2 ) // wersja wska ź nikowa (2) { for ( ; * tekst_1 == * tekst_2 ; tekst_2++ ) tekst_1++ ) return ( 0 ); return ( * * tekst_1 - * tekst_2 ); } . . . // przykładowe zastosowanie funkcji strcmp char tekst[100]; cin >> tekst; if ( strcmp( tekst , ”Kowalski” )==0 ) cout << ”Podales tekst: \”Kowalski\” ”; . . . M. Piasecki, JĘZYKI PROGRAMOWANIA 1 str. 4 (W7) Dane tekstowe - tablice znaków if ( ! Inne wybrane funkcje z biblioteki < string.h > size_t strlen ( const char * s ) od ang. „ str ing len gth ” Funkcja wyznacza i zwraca długość (ilość znaków) łańcucha s (bez znaku ‘\0’) char * strcat ( char * dest, const char * src ) od ang. „ str ing con cat enate ” Funkcja dodaje łańcuch src ( ang. source ) do łańcucha dest ( ang. destination ) Zwraca wskaźnik na połączony łańcuch ( dest ) char * strchr ( const char * s, int c ) od ang. „ str ing ch a r ” Funkcja szuka pierwszego wystąpienia znaku c w podanym łańcuchu s Zwraca wskaźnik na znalezioną pozycję wystąpienia lub adres NULL . char * strrchr ( char * s, int c ) od ang. „ str ing r ight ch a r ” Funkcja szuka ostatniego wystąpienia znaku c w podanym łańcuchu s Zwraca wskaźnik na znalezioną pozycję wystąpienia lub adres NULL . char * strstr ( char * s, const char * sub ) od ang. „ scans str ing for sub str ing ” Funkcja szuka pierwszego wystąpienia łańcucha sub w podanym łańcuchu s Zwraca wskaźnik na znalezioną pozycję wystąpienia lub adres NULL . char * strupr ( char * s ) od ang. „ str ing up pe r ” Funkcja zamienia zawartość łańcucha s na duŜe litery char * strlwr ( char * s ) od ang. „ str ing l o w e r ” Funkcja zamienia zawartość łańcucha s na małe litery M. Piasecki, JĘZYKI PROGRAMOWANIA 1 str. 5 (W7) Dane tekstowe - tablice znaków [ Pobierz całość w formacie PDF ] |