Metodyka i Techniki Programowania
Transkrypt
Metodyka i Techniki Programowania
10 Metodyka i Techniki Programowania C: Łańcuchy znakowe mgr inż. Jacek Wszołek Łańcuchy znakowe (stringi)– wstęp Łańcuchy znakowe wstępnie zostały omówione na lab. 7 (tablice). Jest to konsekwencją faktu, iż w języku C zmienna, która przechowuje w pamięci łańcuch znakowy jest tak naprawdę wskaźnikiem na pierwszy znak przechowywanego łańcucha (podobnie jak tablica). Można zatem łańcuch znaków przedstawić w postaci: char *w = "Daj, ac ja pobrusze,"; można go też zapisać w tablicy znaków: char text[] = "a ty poczywaj"; Należy pamiętać, że każdy łańcuch znaków zakończony jest znakiem '\0' (NULL). Jest to o tyle istotne, że deklarując tablicę o danym rozmiarze, powinniśmy przewidzieć miejsce właśnie na znak końca string'a. Znaki specjalne Znak '\0' nie jest jedynym znakiem specjalnym stosowanym w przetwarzaniu łańcuchów znaków. Najczęściej używane znaki specjalne to: '\r' - powrót kursora (karetki) do początku wiersza '\n' - znak nowego wiersza (linii) '\"' - cudzysłów '\'' - apostrof '\\' - ukośnik wsteczny (backslash) '\t' - tabulator Operacje na łańcuchach Biblioteka standardowa (plik nagłówkowy <string.h>) zawiera funkcje umożliwiające podstawowe operacje na łańcuchach znaków. Są to funkcje operujące na łańcuchach znaków: strcpy(char *dokad, char *skad) (string copy) – podstawowa funkcja kopiująca „stringi”. Kopiując łańcuchy należy pamiętać, aby rozmiar tablicy docelowej (dokąd) był wystarczająco duży tak, aby zmieścił się tam łańcuch znaków z tablicy źródłowej (skąd) z uwzględnieniem znaku końca łańcucha (\0) strncpy() - funkcja do kopiowania łańcuchów z możliwością ograniczenia ilości kopiowanych znaków. Łączenie napisów, funkcje: strcat() oraz strncat(), porównywanie napisów: strcmp() i wiele innych. Przykład: char text1[] = "Limit transmisji danych przekroczono o"; int limit = 124; char text2[] = "megabajtów."; char napis[128]; // złóż tekst... printf( "%s\n", napis ); Uzupełnij powyższy przykład – przekonwertuj liczbę do napisu i umieść wszystkie napisy w odpowiedniej tablicy. Konwersje liczb na tekst (i odwrotnie) W standardowej bibliotece nie ma rozbudowanych funkcji do konwersji liczb na tekst i odwrotnie (można korzystać tylko z sprintf() i rodziny funkcji atof(), atoi()). Nie ma wyrażeń regularnych, konwersji dat, wsparcia dla języków międzynarodowych, przetwarzania tekstu z lewej do prawej, etc... Te wszystkie problemy są w większości rozwiązane w języku C++ jak również w bibliotekach typu Qt. Wczytywanie ze standardowego wejścia Poniżej przedstawiono program wczytujący 10 znaków ze standardowego wejścia (klawiatury) do bufora tab: #include <stdio.h> #include <stdlib.h> int main(void) { char tab[128]; printf( "Wpisz tekst:" ); fgets( tab, 10, stdin ); printf( "wpisano tekst:%s\n", tab ); return EXIT_SUCCESS; } Wykorzystując funkcję scanf(...) i atof(...) + fgets(...) wczytaj tą samą liczbę zmiennoprzecinkową ze standardowego wejścia dwoma metodami i porównaj czy obie liczby są dokładnie takie same. Kodowanie znaków Łańcuchy znakowe zaimplementowane w C są jak na dzisiejsze czasy bardzo przestarzałe. Przede wszystkim działają poprawnie tylko z kodami ASCII, nie działają z obecnie używanym kodowaniem UNICODE. Dla przykładu UTF-8 jest kodem o zmiennej długości, niektóre znaki mają długość jednego bajta niektóre są sekwencjami dwu lub trzy-bajtowymi. Dla takich sekwencji funkcja strlen() będzie wskazywać ilość bajtów z której składa się napis a nie ilość znaków. Zadania: 1. Napisz program, który wczyta kilka słów z klawiatury i policzy ile razy w tej frazie występuje każda litera. Duże i małe litery nie powinny być rozróżniane. Należy założyć, że wczytana fraza może zawierać dowolne znaki.