podstprog09


Wykłady z podstaw programowania f& Język C/C++
9. Wybrane elementy biblioteki
standardowej języka C
Przetwarzanie łańcuchów znakowych
W języku C/C++ nie istnieje osobny typ tekstowy, na którym można
wykonać pewne operacje, np. operację kopiowania, łączenia tekstów. Zamiast
tego posługujemy się łańcuchem znaków interpretowanym jako wartość
tekstowa. Wartości takie przechowane są w tablicach znakowych typu char [].
W przypadku stałych tekstowych do przechowywania używane są ustalone
tablice znakowe typu const char [].
Operacje tekstowe w C/C++ są wykonywane przez odpowiednie funkcje
przetwarzania łańcuchów, dostępne w bibliotece standardowej języka poprzez
plik nagłówkowy: . Większość funkcji jako argument (jeden lub
dwa) przyjmuje wskazanie na pierwszy znak danego łańcucha, natomiast
rezultatem funkcji jest zwykle wskaznik będący jednym z przekazanych
argumentów (zwykle jest to łańcuch docelowy).
Długość tekstu w C/C++ nie jest nigdzie zapamiętana - zakłada się że
tekst kończy się znakiem o kodzie 0 ('\0'). Jeśli w tekście występuje znak '\0' w
innym miejscu niż na końcu lub nie występuje wcale, to standardowe funkcje
operacji na tekstach nie będą działać poprawnie.
1
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Funkcje operacji na tekstach
Przetwarzanie łańcuchów znakowych odbywa się poprzez funkcje
zadeklarowane w pliku ; najczęściej stosowane to:
strlen - zwraca długość podanego łańcucha str na podstawie
znaku '\0' kończącego łańcuch;
int strlen(const char *str);
strcat - dołącza na końcu tekstu wskazywanego przez dest kopię
tekstu src; rezultat jest zakończony znakiem '\0'; nie jest
alokowana pamięć - połączone teksty muszą się zmieścić w
obszarze wskazywanym przez dest;
char *strcat(char *dest,const char *src);
strcpy - kopiuje tekst przekazany w parametrze src do obszaru
pamięci wskazywanego przez dest; kopiowanie kończy się w
momencie skopiowania znaku '\0';
char *strcpy(char *dest,const char *src);
strcmp - służy do porównywania tekstów; teksty porównywane
są znak po znaku od lewej do prawej, aż do napotkania pierwszej
niezgodności; duże i małe litery są rozróżniane; porównywanie
odbywa się według kodów stosowanych na danej maszynie
(ASCII); funkcja zwraca wartość mniejszą od 0, jeśli str1 jest
mniejszy od str2, większą od 0 jeśli str1 jest większy od str2 lub
równą 0 jeśli oba łańcuchy są identyczne;
int strcmp(const char *str1,const char *str2);
2
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
strchr - zwraca wskaznik na pierwsze wystąpienie znaku chr w
tekście wskazywanym przez str; jeśli znak nie występuje
zwracany jest wskaznik zerowy (NULL);
char *strchr(char *str,int chr);
strstr - znajduje pierwsze wystąpienie ciągu znaków str2
(wyłączając kończący znak '\0') w tekście str1 i zwraca wskaznik
do znalezionego ciągu znaków; jeśli ciąg znaków nie został
znaleziony zwracana jest wartość NULL; jeśli str2 jest ciągiem
pustym - zwracany jest wskaznik str1;
char *strstr(char *str1,const char *str2);
Przykład 1:
#include
#include
void main()
{
char napis[80], wynik[80];
printf("napis = ");
gets(napis); /* pobierz linie z konsoli */
strcpy(wynik, napis); /* wynik=napis */
strcat(wynik, napis); /* wynik=wynik+napis */
printf("wynik = %s\n", wynik);
}
3
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Przykład 2:
#include
#include
void main()
{
char napis1[80], napis2[80];
/* Wczytanie dwoch lancuchow
i wypisanie ich w porzadku
alfabetycznym (leksykograficznym):
*/
printf("n1 = ");
gets(napis1);
printf("n2 = ");
gets(napis2);
if (strcmp(napis1, napis2) < 0) { /* napis1 < napis2 */
printf("\n%s\n", napis1);
printf("%s\n", napis2);
} else { /* napis1 >= napis2 */
printf("\n%s\n", napis2);
printf("%s\n", napis1);
}
}
Przetwarzanie plików danych
W języku C/C++ dostęp do plików w operacjach we/wy odbywa się
poprzez abstrakcyjną strukturę strumienia danych, zawierającą wszystkie
informacje opisujące dany plik. Dla każdego zwykłego pliku należy utworzyć
nową strukturę odpowiedniego strumienia, zanim rozpocznie się przetwarzanie
pliku. W języku C struktura ta nosi nazwę FILE.
4
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Pojęcie strumienia danych wykracza poza zwykłe pliki przechowywane
na dysku i obejmuje również inne urządzenia fizyczne, do których można
wysyłać dane lub z których można dane odczytywać. Strumienie zatem mogą
być związane z klawiaturą, ekranem, drukarką itp.
W języku C istnieje kilka predefiniowanych strumieni we/wy, z których
najważniejsze to: strumień stdin reprezentujący standardowe urządzenie
wejściowe (klawiatura) oraz strumień stdout reprezentujący standardowe
urządzenie wyjściowe (ekran) w systemie. Niebuforowane operacje wyjścia
można wykonywać poprzez strumień stderr, który również związany jest z
ekranem; strumień ten zwykle służy do wyprowadzania komunikatów o
błędach programu.
Funkcje operacji na plikach danych
Przetwarzanie plików danych odbywa się poprzez funkcje
zadeklarowane w pliku ; najważniejsze to:
fopen - otwiera plik o podanej nazwie i trybach otwarcia, tworzy
strukturę strumienia związanego z plikiem i zwraca wskaznik do
struktury; gdy otwarcie się nie powiedzie - zwraca wartość NULL;
FILE *fopen(const char *nazwa, const char *tryb);
Nazwa pliku może zawierać ścieżce dostępu. W przypadku ścieżek o formacie
dosowym należy użyć znaku '\\'. Tryb otwarcia pliku przyjmuje wartości: "r" -
odczyt pliku istniejącego, "w" - utworzenie nowego pliku do zapisu z
usunięciem pliku istniejącego, "a" - zapis na końcu pliku nowego lub
istniejącego, "r+" - odczyt i zapis pliku istniejącego, "w+" - utworzenie
nowego pliku do zapisu i odczytu z usunięciem pliku istniejącego, "a+" - zapis
i odczyt na końcu pliku nowego lub istniejącego. Dodatkowo w trybie można
podać rodzaj pliku: "b" - binarny oraz "t" - tekstowy.
5
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
fclose - zamyka plik i niszczy podaną strukturę strumienia
związanego z plikiem; zwraca 0, gdy operacja zamknięcia się
powiodła;
int fclose(FILE *plik);
fprintf - sformatowany zapis danych do podanego strumienia;
działanie analogiczne do funkcji printf;
int fprintf(FILE *plik, const char *format, ...);
fscanf - sformatowany odczyt danych z podanego strumienia;
działanie analogiczne do funkcji scanf;
int fscanf(FILE *plik, const char *format, ...);
fwrite - niesformatowany zapis danych do podanego strumienia;
zwykle stosuje się dla plików binarnych; zwraca liczbę zapisanych
jednostek;
size_t fwrite(const void *bufor, size_t rozmiar,
size_t ilosc, FILE *plik);
gdzie bufor jest wskaznikiem do obszaru zawierającego dane do zapisu,
rozmiar jest liczbą bajtów jednostki danych w buforze, ilosc określa, ile
jednostek należy zapisać do strumienia.
fread - niesformatowany odczyt danych z podanego strumienia;
zwykle stosuje się dla plików binar.; zwraca liczbę odczytanych
jednostek;
size_t fread(void *bufor, size_t rozmiar, size_t
ilosc, FILE *plik);
gdzie bufor jest wskaznikiem do obszaru, do którego zostaną przesłane dane
odczytane ze strumienia, rozmiar jest liczbą bajtów jednostki danych, ilosc
określa, ile jednostek należy odczytać ze strumienia.
6
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Przykład:
#include
void main(void)
{
FILE *plik;
double tab[25];
int i, n;
if ((plik = fopen( "dane.bin", "w+b" )) != NULL) {
for ( i = 0; i < 25; i++ ) tab[i] = i*1.1;
fwrite( tab, sizeof( double ), 25, plik );
fclose( plik );
} else
printf( "Blad otwarcia pliku do zapisu\n" );
if ((plik = fopen( "dane.bin", "r+b" )) != NULL) {
n=fread( tab, sizeof( double ), 25, plik );
printf( "elem. odczytanych: %d\n", n );
fclose( plik );
} else
printf( "Blad otwarcia pliku do odczytu\n" );
}
Dynamiczny przydział pamięci
Obok zmiennych o statycznej i automatycznej klasie pamięci w
programach mogą istnieć również zmienne dynamicznej klasy pamięci, zwane
w skrócie zmiennymi dynamicznymi. Zmiennym tym przydziela się pamięć w
specjalnym obszarze zwanym stertą lub pamięcią wolną.
O ile zmienne statyczne istnieją przez cały czas działania programu,
zmienne dynamiczne są tworzone i usuwane w dowolnym momencie
przebiegu programu. Pod tym względem zmienne te są podobne do zmiennych
automatycznych, jednakże do ich zarządzania (tworzenia/usuwania) należy
użyć specjalnych funkcji standardowych.
7
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Funkcje przydziału i operowania pamięcią
Przydział pamięci na stertcie odbywa się poprzez funkcje zadeklarowane
w pliku ; najczęściej stosowane to:
malloc - tworzy zmienną dynamiczną o podanym rozmiarze i
zwraca wskaznik do zmiennej;
void *malloc(size_t rozmiar);
Ponieważ utworzona zmienna nie posiada określonego typu (jest amorficzna),
więc w celu dostępu do zmiennej należy zastosować odpowiednią konwersję
do żądanego typu.
free - niszczy zmienną dynamiczną o podanym adresie;
void free(void *adres);
Dodatkowe operacje na dowolnej amorficznej pamięci odbywają się
poprzez funkcje zadeklarowane w pliku , np.:
memset - wypełnia obszar pamięci o podanym adresie
wartościami danego bajtu o podanej ilości; zwraca adres;
void *memset(void *adres, int bajt, size_t ilosc);
memcpy - kopiuje podaną ilość bajtów z obszaru zródłowego do
obszaru docelowego; zwraca adres docelowy;
void *memcpy(void *cel, const void *zrodlo,
size_t ilosc);
8
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Przykład:
#include
#include
void main(void)
{
double *tab;
int i, n;
n = 25*sizeof( double );
tab = (double *)malloc(n);
memset(tab, 0, n);
for ( i = 0; i < 25; i++ )
tab[i] = i*1.1;
free(tab);
}
9
PDF created with pdfFactory Pro trial version www.pdffactory.com


Wyszukiwarka

Podobne podstrony:
w08 PodstPrzy roznor
KOMUNIKACJA PODSTPSYCH WYK2
podstprog01
w02 PodstPrzy zycie
podstprog02
podstpr
w04 PodstPrzy proddekomp
w07 PodstPrzy krajobrazy
podstprog07
podstprog04
podstprog10
w05 PodstPrzy cykle
podstprog06
w06 PodstPrzy klimat

więcej podobnych podstron