Łańcuch znakowy
• Łańcuch znakowy jest ciągiem składającym się z
jednego lub więcej znaków znaki cudzysłowu nie
są częścią łańcucha
• Język C nie posiada specjalnego typu
łańcuchowego. Zamiast tego łańcuchy są
przechowywane w tablicach zbudowanych z
elementów typu char
• kolejne znaki z których składa się łańcuch
znajdują się w kolejnych komórkach pamięci, a
tablica jest właśnie grupą sąsiadujących ze sobą
miejsc w pamięci – rozmieszczenie łańcucha w
tablicy jest całkiem naturalnym rozwiązaniem
Tablice znakowe
Tablice znakowe: char nazwa[rozmiar]
dwa sposoby inicjalizacji:
char t[30] = {‘A’,’l’,’a’,’ ‘,’m’,’a’, ’ ’ ,‘k’,’o‘,’t‘,’a’};
kolejne bajty zawierają kolejne znaki tekstu
reszta wyzerowana
char t[30] = {”Ala ma kota”};
struktura pamięci będzie identyczna jednak w tym
wypadku z łańcucha jest też kopiowany bajt
zerowy !
W tablicy warto przechowywać rozmiar-1
znaków i dopełniać je bajtem zerowym a
wielokrotnie unikniemy problemów z
pamięcią !
Łańcuch znakowy
A l
a
m a
k o t
a \0
• W ostatniej pozycji tablicy znajduje się znak \0 –
nie jest on cyfrą zero, jest on znakiem
niedrukowanym o kodzie równym 0
• tablica musi mieć długość przynajmniej o jedną
komórkę większą niż długość zapisanego w niej
łańcucha
Funkcje operujące na łańcuchach
funkcja gets( )
• Przydatna w programach interaktywnych
• Pobiera łańcuch ze standardowego wejścia czyli
z klawiatury
• Ponieważ łańcuchy nie mają z góry określonej
długości gets() musi wiedzieć kiedy zakończyć
odczytywanie – pobiera znaki do napotkania
znaku nowej linii \n generowanego przez
wciśnięcie klawisza ENTER
• Pobiera znaki do znaku nowej linii (ale bez
niego), dodaje znak zerowy (\0) i przekazuje
łańcuch do programu – nie sprawdza, czy dane
się mieszczą
Wczytanie łańcucha
funkcja fgets( )
• Pobiera łańcuch ze standardowego wejścia czyli
z klawiatury
Różni się od gets():
• pobiera drugi argument określający max liczbę
znaków do pobrania
• jeśli odczyta znak nowej linii pozostawia go w
łańcuchu w przeciwieństwie do gets(), która go
odrzuca
• pobiera trzeci argument określający plik, z
którego mają zostać pobrane dane
• aby wczytać dane z klawiatury trzeba użyć
argumentu stdin (standard input) – identyfikator
zdefiniowany w pliku stdio.h
Wczytywanie łańcuchów
#include<stdio.h>
#define MAX 80
int main()
{
char imie[MAX]; /*przydzielenie miejsca */
printf("Jak masz na imie? \n");
gets(imie); /*umieszcza łańcuch w tablicy imie
*/
printf("Bardzo ładne imię %s\n",imie);
}
Wyświetlanie łańcuchów
• Język C zawiera standardowe funkcje
biblioteczne służące do wyświetlania łańcuchów
– printf(), puts(), fputs()
puts()
Bardzo prosta w użyciu – wystarczy przekazać jej
adres łańcucha jako argument
zatrzymuje się w momencie napotkania znaku
zerowego – nusi się on znajdować na końcu
łańcucha
wariant puts przystosowany do współpracy z plikami
Różnice:
• fputs() pobiera drugi argument określający plik,
do którego należy zapisać dane
• aby wyświetlić dane na ekranie należy użyć
argumentu stdout (standard output
• w przeciwieństwie do puts(), fputs() nie daje
znaku nowej linii
Wyświetlanie łańcuchów
fputs()
Funkcje operujące na łańcuchach
Operacje na łańcuchach wymagają
specjalizowanych funkcji
void strcpy(cel, zrodlo) ;
• kopiuje łańcuch pod adres przechowywany
przez pierwszy parametr – powinien on
wskazywać na obiekt danych taki jak tablica,
posiadający wystarczającą ilość miejsca, aby
przechować łańcuch wyjściowy
• zwraca adres znaku – wartość jej pierwszego
argumentu
• pierwszy argument nie musi wcale wskazywać
na początek tablicy, co pozwala dołączyć drugi
łańcuch w dowolnym miejscu pierwszego
Biblioteki standardowe dostarczają wielu
funkcji pracujących na łańcuchach
Funkcje operujące na łańcuchach
void strncpy(cel, zrodlo, n) ;
• Funkcja strcpy ma pewną wadę – nie sprawdza
zawczasu, czy łańcuch źródłowy zmieści się w
łańcuchu docelowym
• Bezpieczniejszy sposób kopiowania łańcuchów
udostępnia funkcja strncpy()
• Pobiera ona trzeci argument – maksymalną
liczbę znaków do skopiowania
Funkcje operujące na łańcuchach
void strcmp() ;
• służy do porównywania zawartości łańcuchów a
nie ich adresów
• znaki są porównywane w oparciu o ich
reprezentację liczbową, czyli wartość ASCII
strcmp("A","a") zwraca wartość ujemną
• gdy liczba zwracana jest równa zera - łańcuchy
się zgadzają
• gdy liczba zwracana jest różna od zera -
łańcuchy nie są zgodne
Funkcje operujące na łańcuchach
void strncmp() ;
• porównuje kolejne znaki łańcuchów do momentu
znalezienia znaków o różnych kodach lub do
momentu porównania ilości znaków określonej
przez trzeci argument
Funkcje operujące na łańcuchach
strlen() -
zwraca długość łańcucha
getchar(), putchar()
zajmują się tylko znakami – są szybsze i
poręczniejsze od scanf() i printf()
getchar() –
zwraca kolejny znak z łańcucha
wejściowego
putchar() –
wyświetla na ekranie przekazany
jej argument