Na dzisiejszych zajęciach zajmiemy się omówieniem pozostałych bibliotek i funkcji dla nich przypisanych. Na pocztek - obsługa błędów. Wiele funkcji bibliotecznych ustawia znaczniki stanu dla strumieni po napotkaniu końca pliku lub gdy wystąpi błąd. Te znaczniki mogą być ustawiane i sprawdzane jawnie. Dodatkowo, wartością wyrażenia całkowitego errno (zadeklarowanego w bibliotece <errno.h>) może być numer błędu, który bliżej określa ostatnio napotkany błąd.Do obsługi błędów wykorzystać można funkcje:
- int ferror()- void clearerr() - void perror()- int feof()
Zacznijmy od funkcji ferror(). Funkcja zwraca wartość różną od zera w przypadku, gdy jest ustawiony znacznik błędu dla strumienia stream. Deklarujemy ją w nastepujący sposób:
int ferror(FILE *stream)
Funkcja clearerr() z kolei kasuje znaczniki końca pliku i błędu dla strumienia stream. Zobaczmy w poniższym fragmencie kodu, jak się uzywa tych dwóch funkcji:
int main(void) {
FILE *stream;
stream = fopen("tes.txt", "w");
getc(stream); //wymuszenie bledu poprzez probe odczytu
if (ferror(stream)) {
printf("Blad\n");
clearerr(stream); } // kasowanie bledu strumienia
fclose(stream);
return 0;}
Kolejna ważna funkcja to funkcja perror(). Funkcja ta funkcja wypisuje tekst z tablicy s i (zależny od implementacji) komunikat o błędzie odpowiadający wartości errno. Działanie funkcji można przedstawić jako:
fprintf(stderr, "%s: %s\n", s, "komunikat o bledzie");
Oto, jak się ją deklaruje:
void perror(const char *s)
I spójrzmy teraz na fragment programu z użyciem tej funkcji:
FILE *fp;
fp = fopen(”dane.dan", "r");
if (!fp) perror(”dane.dan");
//dane.dan: No such file or directory
No i czwarta z tych funkcji to funkcja feof().Zwraca ona wartość różną od zera w przypadku, gdy jest ustawiony znacznik końca pliku dla strumienia stream. Deklaruje się ja nastepująco:
int feof(FILE *stream)
I przykład z użyciem tej funkcji:
#include <stdio.h>
stream = fopen("dane.txt", "r");
fgetc(stream);
if (feof(stream)) printf("Koniec pliku\n");
Przejdźmy teraz do biblioteki <ctype.h>. Nagłówek <ctype.h> zawiera deklaracje funkcji służących do klasyfikowania znaków. We wszystkich funkcjach argument c jest typu int o wartości albo równej EOF, albo wyrażalnej jako unsigned char, a wynik jest typu int. Funkcje zwracają wartość różną od zera (TRUE), jeśli argument c spełnia podany warunek albo należy do wskazanej klasy znaków; w przeciwnym przypadku zwracają zero. W skład tej biblioteki wchodzą nastepujące funkcje operujące na znakach:
• isalnum(c) Prawdą jest albo isalpha(c), albo isdigit(c).
• isalpha(c) Prawdą jest albo isupper(c), albo islower(c).
• iscntrl(c) Znak kontrolny.
• isdigit(c) Cyfra dziesiętna.
• isgraph(c) Znak drukowalny za wyjątkiem odstępu.
• islower(c) Mała litera.
• isprint(c) Znak drukowalny łącznie z odstępem.
• ispunct(c) Znak drukowalny za wyjątkiem odstępu, liter i cyfr.
• isspace(c) Odstęp, nowa strona, nowy wiersz, powrót
karetki, tabulator, pionowy tabulator.
• isupper(c) Wielka litera.
• isxdigit(c) Cyfra szesnastkowa.
Zobaczmy na przykład uzycia jednej z tych funkcji:
#include <ctype.h>
char c = 'C';
if (isdigit(c))
printf("%c jest cyfra\n",c);
else printf("%c nie jest cyfra \n",c);
Prócz tych funkcji wyżej wymienionych istnnieją jeszcze dwie ciekawe funckje służące do zamiany wielkości liter. Te funckje to:
- int tolower(int c) - Zamienia c na małą literę.
- int toupper(int c) - Zamienia c na wielką literę.
I przykład użycia jednej z tych funkcji:
#include <string.h>
int main(void){
int length, i;
char *string = ”oto tekst";
length = strlen(string);
for (i=0; i<length; i++)
{string[i] = toupper(string[i]);};
printf("%s\n",string);
return 0; }
Funkcje służące do operacji na tekstach znajdują się w bibliotece <string.h>. W nagłówku <string.h> są zdefiniowane dwie grupy funkcji operujących na tekstach. Do pierwszej grupy należą funkcje, których nazwy rozpoczynają się od str, do drugiej grupy - od mem. Z wyjątkiem funkcji memmove(), skutek kopiowania instancji, które częściowo się pokrywają, nie jest zdefiniowany. Argumenty funkcji porównujących są traktowane jak tablice zmiennych typu unsigned char. Oto ważniejsze z tych funkcji i ich deklaracje. Pierwszą jest funkcja strcpy. Kopiuje ona tekst z ct do s łącznie ze znakiem '\0'. Zwraca s.
char *strcpy(char *s, const char *ct)
Kolejna, czyli strncpy kopiuje co najwyżej n znaków tekstu z ct do s. Jeżeli ct ma mniej niż n znaków, dopełnia s znakami '\0'. Zwraca s.
char *strncpy(char *s, char *ct, int n)
Nastepna o nazwie strcat dopisuje znaki tekstu z ct na koniec tekstu w s. Zwraca s.
char *strcat(char *s, char *ct)
I kolejna o nazwie strncat. Ta funkcja dopisuje co najwyżej n znaków tekstu ct na koniec tekstu w s. Tekst w s kończy znakiem '\0'. Zwraca s.
char *strncat(char *s, char *ct, int n)
Poniżej znajduje się przykład, który pokazuje, jak została użyta jedna z tych funkcji, o której powiedzieliśmy powyżej:
char string[10];
char *str1 = "abcdefghi";
strcpy(string, str1);
printf("%s\n", string);
Następną z tych funkcji jest funkcja strcmp. Porównuje ona teksty zawarte w cs i ct. Zwraca wartość < 0 dla cs < ct, wartość 0 dla cs == ct lub wartość > 0 dla cs > ct. Oto deklaracja:
funkcja int strcmp(char *cs, char *ct)
Kolejna – strncmp porównuje co najwyżej n znaków tekstów zawartych w cs i ct. Zwraca wartość < 0 dla cs < ct, wartość 0 dla cs == ct lub wartość > 0 dla cs > ct. Oto deklaracja:
int strncmp(char *cs, char *ct, int n)
I następna z tych funkcji to strchr. Zwraca ona wskaźnik do pierwszego wystąpienia znaku c w tekście cs lub NULL, jeśli ten znak nie występuje. Deklarujemy ją w następujący sposób:
char *strchr(char *cs, char *c)
No i nastepna o nazwie strrchr. Zwraca ona wskaźnik do ostatniego wystąpienia znaku c w tekście cs lub NULL, jeśli ten znak nie występuje. Dklarjemy ją w nastepujacy sposób:
char *strrchr(char *cs,int c)
Zobaczmy na przykład uzycia jednej z tych powyższych czterech funkcji:
char *buf1 = "aaa", *buf2 = "bbb";
int ptr;
ptr = strcmp(buf2, buf1);
if (ptr > 0) printf("bufor 2 jest wiekszy niz bufor 1\n");
else printf("bufor 2 jest mniejszy niz bufor 1\n");
No i ostatnie dwie funkcje, to strstr i strtok. Ta pierwsza zwraca wskaźnik do pierwszego wystąpienia tekstu ct w tekście cs lub NULL, jeśli ct nie występuje w cs. Oto, jak się ja deklaruje:
char *strstr(char *cs, char *ct)
Ta druga wyszukuje w tekście s ciągi znaków przedzielone znakami z ct. Deklarujemy ja tak:
char *strtok(char *s, char *ct)
No i przykład uzycia jednej z tych dwóch funkcji:
#include <conio>
char *str1 = "Hello World", *str2 = "orld", *ptr;
ptr = strstr(str1, str2);
printf("Podciag: %s\n", ptr); //”orld”
getch();
Kolejne ważne funkcje to funckje matematyczne. One zapisane są w bibliotece math.h. Nagłówek <math.h> zawiera deklaracje funkcji i makr matematycznych. Przy korzystaniu z tych funkcji należy zwracać uwage na mozliwość popełnienia dwóch rodzajów błędów. Pierwszy to błąd dziedziny. Występuje, gdy argument funkcji nie należy do dziedziny, dla której funkcja została zdefiniowana. I drugi to błąd zakresu, który występuje wówczas, gdy wartość funkcji nie może być wyrażona jako double. Jeśli wynik jest nadmiarowy, to funkcja zwraca HUGE_VAL z właściwym znakiem. Jeśli wynik jest nie domiarowy, to funkcja zwraca zero. Argumentami tych funkcji są zmienne x i y typu double, a argument n jest typu int. Wszystkie funkcje zwracają wartość typu double. Wartości kątów dla funkcji trygonometrycznych wyraża się w radianach. Oto przykładowe funckje:
sin(x) Sinus x.
cos(x) Cosinus x.
tan(x) Tangens x.
sinh(x) Sinus hiperboliczny x.
cosh(x) Cosinus hiperboliczny x.
tanh(x) Tangens hiperboliczny x.
exp(x) Funkcja wykładnicza e^x.
log(x) Logarytm naturalny z x > 0.
log10(x) Logarytm o podstawie 10 z x > 0.
pow(x,y) Różnica symetryczna x^y.
sqrt(x) Pierwiastek z x.
ceil(x) Wyciąga najmniejszą liczbę całkowitą, nie mniejszą niż x. Wynik jest typu double.
floor(x) Wyciąga największą liczbę całkowitą, nie większą niż x. ...
i7xn1