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.

Podobne dokumenty