PODSTAWY INFORMATYKI 1 PRACOWNIA NR 9 TEMAT

Transkrypt

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 9 TEMAT
PODSTAWY INFORMATYKI 1
PRACOWNIA NR 9
TEMAT: Programowanie w języku C/C++: łańcuchy znakowe,
podstawowe funkcje biblioteczne dotyczące łańcuchów
znakowych.
Łańcuchy znakowe
Łańcuch znaków (napis, stała napisowa) jest to ciąg złożony z zera lub większej
liczby znaków zawartych między znakami cudzysłowu, np.
”napis”
- znaki cudzysłowu nie są częścią napisu, określają jedynie jego granice,
W rzeczywistości łańcuch znaków jest tablicą, której elementami są pojedyncze
znaki (tablica elementów typu char). Ostatnim elementem tablicy jest znak o
kodzie 0 (stała liczbowa 0 lub stała znakowa ’\0’), oznaczający koniec napisu.
Większość funkcji standardowych języka C dodaje automatycznie na końcu ten
znak.
"Pies"
P
i
e
s \0
Rozmiar fizycznej pamięci przeznaczonej na napis musi być o jeden większy niż
liczba znaków zawartych między znakami cudzysłowu.
Deklaracja zmiennej mogącej przechowywać napis jest podobna do deklaracji
zwykłej tablicy:
typ zmienna[rozmiar];
char txt[20];
- deklaracja tablicy, w której można przechowywać
napisy o max. długości do 19 znaków.
Inicjalizacja łańcucha znaków
Deklarując łańcuch znaków możemy nadać mu wartość początkową, np.
char txt[10] = ”Pies”;
P
i
e
s \0 \0 \0 \0 \0 \0
pozostałym elementom tablicy
przypisywana jest wartość zero
To samo można uzyskać podając pojedyncze litery umieszczone w apostrofach,
np.
char txt[10] = {’P’,’i’,’e’,’s’};
Podstawy Informatyki 1
-1-
© 2005 Jarosław Forenc
Deklarując napis można nie określać jego długości, kompilator przydzieli wtedy
automatycznie odpowiedni rozmiar pamięci (uwzględniając ostatni znak ’\0’), np.
char *txt = ” To jest napis” ;
char txt[] = ” To jest napis” ;
lub
W powyższy sposób można nadawać wartość łańcuchowi znaków tylko przy
jego deklaracji. Błędnym zatem jest poniższy zapis:
char txt[10];
txt = ” Pies” ;
- taki zapis nie jest poprawny.
Prawidłowy zapis wymaga wykorzystania funkcji strcpy() z pliku nagłówkowego
string.h:
char txt[10];
strcpy(txt,” Pies” );
Stała znakowa
Stała znakowa jest to liczba całkowita. Tworzy ją jeden znak ujęty w apostrofy, np.
’x’. Wartością stałej znakowej jest wartość kodu ASCII, np.
kod
ASCII
znak
kod
ASCII
znak
kod
ASCII
znak
48
49
50
...
57
0
1
2
...
9
65
66
67
...
90
A
B
C
...
Z
97
98
99
...
122
a
b
c
...
z
Pewne znaki niegraficzne mogą być reprezentowane w stałych znakowych przez
sekwencje specjalne, które wyglądają jak dwa znaki, ale reprezentują tylko jeden
znak, np.
’\n’
’\t’
’\v’
’\a’
’\\’
’\’’
’\” ’
’\?’
nowy wiersz
tabulator poziomy
tabulator pionowy
alarm
\ (ang. backslash)
apostrof
cudzysłów
znak zapytania
Zapis ’A’ oznacza jeden znak, natomiast zapis ” A” - dwa znaki, gdyż jest to napis
kończący się znakiem ’\0’.
Podstawy Informatyki 1
-2-
© 2005 Jarosław Forenc
Funkcje do wprowadzanie i wyprowadzanie znaków
Funkcja: printf
Nagłówek: int printf(const char *format,...);
Do wyświetlenia łańcucha znaków używamy: %s, zaś pojedynczego znaku: %c.
Funkcja scanf
Nagłówek: int scanf(const char *format,...);
Do wczytania łańcucha znaków używamy: %s, zaś pojedynczego znaku: %c.
Funkcji scanf nie można wykorzystać do wczytania łańcucha znaków
zawierającego spacje, gdyż wczytywanie zakończy się na pierwszej spacji
(w takim przypadku należy wykorzystać funkcję gets).
Funkcja gets
Nagłówek: char *gets(char *s);
Funkcja gets wczytuje wiersz (ciąg znaków zakończony ’\n’) ze strumienia stdin
(klawiatura) i umieszcza w obszarze pamięci wskazywanym przez s zastępując ’\n’
znakiem ’\0’. Funkcja zwraca wskaźnik na początek wypełnianego obszaru, np.
char bufor[80];
gets(bufor);
Funkcja puts
Nagłówek: int puts(const char *s);
Funkcja puts wypisuje na stdout (ekran) zawartość łańcucha znakowego (ciąg
znaków zakończony znakiem ’\0’) zastępując znak ’\0’ znakiem ’\n’.
char bufor[80] = ” to jest tekst” ;
puts(bufor);
Funkcja getch
Nagłówek: int getch(void);
Funkcja getch czyta znak z klawiatury bez echa na ekranie.
int znak;
znak = getch();
Podstawy Informatyki 1
-3-
© 2005 Jarosław Forenc
Plik nagłówkowy string.h
Prototyp funkcji
Opis
size_t strlen(const char *s);
zwraca długość łańcucha znaków (nie bierze pod
uwagę znaku ’\0’),
char *strcpy(char *s1, const char *s2);
kopiuje łańcuch s2 do łańcucha s1,
char *strcat(char *s1, const char *s2);
dołącza do łańcucha s1 łańcuch s2,
int strcmp(const char *s1, const char *s2);
porównuje łańcuchy s1 i s2 z rozróżnianiem
wielkości liter, zwraca 0 gdy s1=s2, wartość
mniejszą od zera, gdy s1<s2 i wartość większą od
zera, gdy s1>s2,
int strcmpi(const char *s1, const char *s2);
działa jak strcmp, ale bez rozróżniania wielkości
liter,
char *strlwr(char *s);
zamienia w łańcuchu s duże litery na małe,
char *strrev(char *s);
odwraca kolejność znaków w łańcuchu s,
char *strset(char *s, int c);
wypełnia łańcuch s znakiem c,
przeszukuje łańcuch s1 w celu odnalezienia
podłańcucha s2 zwracając wskazanie do elementu
char *strstr(const char *s1, const char *s2); łańcucha s1, od którego zaczynają się znaki takie
same jak w łańcuchu s2, lub NULL, gdy s2 nie
występuje w s1,
char *strupr(char *s);
zamienia w łańcuchu s litery małe na duże.
Przykład 1
#include <stdio.h>
#include <string.h>
int main()
{
char napis1[] = "tekst w buforze";
char napis2[20];
int dlugosc;
}
printf("napis1: %s \n",napis1);
dlugosc = strlen(napis1);
printf("liczba znakow w napis1: %d \n",dlugosc);
strupr(napis1);
printf("napis1 (duze litery): %s \n",napis1);
strlwr(napis1);
printf("napis1 (male litery): %s \n",napis1);
strcpy(napis2,napis1);
printf("napis2: %s \n",napis2);
strrev(napis2);
printf("napis2 (odwrocony): %s \n",napis2);
return 0;
Podstawy Informatyki 1
-4-
© 2005 Jarosław Forenc