Programowanie
w języku C
© 2012
Grzegorz Łukawski & Maciej Lasota Politechnika Świętokrzyska w Kielcach Zarządzanie pamięcią, funkcje związane z datą i czasem.
comm
#include <ctype.h>
Funkcje zwracają wartość niezerową gdy znak 'z' należy do danej kategori : Funkcja
Kategoria znaku
isdigit(z)
Cyfra dziesiętna
isxdigit(z)
Cyfra szesnastkowa
islower(z)
Mała litera (bez polskich znaków) isupper(z)
Wielka litera (j.w.)
isalpha(z)
Mała lub wielka litera (j.w.)
isalnum(z)
Mała lub wielka litera lub cyfra dziesiętna (j.w.)
#include <ctype.h>
Zamiana wielkości znaków (bez polskich znaków): tolower(z)
- na małą literę (jeśli była duża) toupper(z)
- na dużą literę (jeśli była mała)
Konwersja znaków na liczby i odwrotnie
#include <stdlib.h>
Konwersja ciągów znaków na liczby: double atof(char *s)
Ciąg znaków na wartość double
int atoi(char *s)
Ciąg znaków na wartość int
long atol(char *s)
Ciąg znaków na wartość long
char tk[50], int n;
sprintf(tk, ”n=%d”, n);
sscanf(tk, ”%d”, &n);
#include <mem.h>
#include <string.h>
void *memset(void *ptr, int value, size_t num);
● ptr
- wskaźnik na początek bloku pamięci,
● value
- wartość (bajt) którym wypełnić blok,
● num
- wielkość bloku w bajtach.
int tab1[32];
memset(tab1, 0, sizeof(tab1));
// Zerowanie tablicy
Kopiowanie bloków pamięci void *memcpy(void* dest, const void* src, size_t size);
● dest
- wskaźnik na miejsce docelowe w pamięci,
● src
- wskaźnik na miejsce źródłowe w pamięci,
● size
- wielkość bloku w bajtach.
char dane1[20], dane2[20];
//...
memcpy(dane1, dane2, sizeof(dane1)); // dane1 = dane2
Porównywanie bloków pamięci int memcmp(const void *s1, const void *s2, size_t size);
● s1
- wskaźnik na pierwszy blok pamięci,
● s2
- wskaźnik na drugi blok pamięci,
● size
- wielkość bloku(ów) w bajtach.
Funkcja zwraca wyniki analogicznie do funkcji strcmp(), czyli 0 gdy bloki są takie same.
char dane1[20], dane2[20];
//...
if( memcmp(dane1, dane2, sizeof(dane1)) == 0 ) puts(”Dane są identyczne!”);
#include <stdlib.h>
void *malloc( size_t size );
void *calloc( size_t num, size_t size );
● size
- rozmiar bloku danych,
● num
- liczba bloków danych.
Do przechowywania przydzielonych bloków danych należy wykorzystać wskaźniki, zawsze trzeba wykonać rzutowanie na pożądany typ: int *b1, *b2;
b1 = (int*)malloc(sizeof(int) * 50); b2 = (int*)calloc(sizeof(int), 50);
Dynamiczny przydział pamięci W przypadku niepowodzenia (braku pamięci) funkcje zwracają wartość NULL:
int *wsk = (int*)malloc(1024*1024); if(wsk == NULL) {
puts(”Brak pamieci!”);
exit(0);
}
Obszar przydzielony dynamicznie można traktować jak tablicę: wsk[0] = 1;
wsk[1] = 2;
y = wsk[i] + wsk[i+1];
Zmiana rozmiaru bloku pamięci void *realloc( void * ptr, size_t size );
● ptr
- wskaźnik na blok danych którego rozmiar chcemy zmienić,
● size
- nowy rozmiar.
UWAGA
Należy uważać żeby nie „zgubić” wskaźnika na przydzielony obszar, np.
nadpisując go przez kolejne wywołan ie mal oc/cal oc.
Zwalnianie pamięci void free(void *ptr);
● ptr
- wskaźnik na blok danych.
UWAGA
Niedozwolone jest kilkukrotne zwalnianie tego samego obszaru pamięci, ani zwalnianie pamięci nie przydzielo nej przez omówione funkcje.
Dynamiczne struktury danych – listy struct el_li {
char nazwa[32];
float cena;
struct el_li *next;
};
struct el_li *lista = NULL;
#include <time.h>
Odczytu aktualnego czasu kalendarzowego – liczba sekund która upłynęła od północy (0:00), 1 stycznia 1970 roku: time_t time(time_t *tp);
Przykład (argumentem może być NULL): time_t czas_sek = time(NULL);
Przekształcanie wartości (czas lokalny) na strukturę tm: struct tm *czas = localtime(&czas_sek); int
rok = czas->tm_year + 1900;
struct tm {...}
Najważniejsze pola struktury przechowującej czas i datę (int): Nazwa pola
Opis
Zakres wartości
tm_sec
sekundy po minucie
0..59
tm_min
minuty po godzinie
0..59
tm_hour
godziny po północy
0..23
tm_mday
dzień miesiąca
1..31
tm_mon
miesiąc od stycznia
0..11
tm_year
lata od 1900 roku
-
tm_wday
dni od niedzieli
0..6
tm_yday
dni od 1 stycznia
0..365
Obliczenia czasu Funkcja zwraca różnicę czas2 czas1
‑
wyrażoną w sekundach:
double difftime(czas2, czas1);
int main() {
char str[64];
time_t start, end;
start = time(NULL);
printf("Podaj imie: "); fgets(str, 64-1, stdin);
end = time(NULL);
printf("Zajelo Ci to %.2lf sek.\n", difftime(end, start));
}
Formatowanie czasu i daty Formatuje czas i umieszcza w podanym buforze tekstowym. Przy formatowaniu mogą być wzięte pod uwagę lokalne ustawienia i język w jakim pracuje system operacyjny: char bufor[64+1];
strftime(bufor, 64, "%H:%M", czas_tm); UWAGA
Sekwencje formatujące funkcji strftime() mają inne znaczenie niż takie same sekwencje funkcji z rodziny pri ntf()!
Formatowanie czasu i daty Sekwencja
Opis
Przykład
%a
skrócona i pełna nazwa dnia tygodnia Wed
%A
Wednesday
%b
skrócona i pełna nazwa miesiąca
Apr
%B
April
%d
dzień miesiąca
25
%H
godzina – zegar 24 i 12-godzinny 19
%I
07
%p
miejscowy odpowiednik AM/PM
PM
%j
dzień roku
116
%m
numer miesiąca w roku
5
%M
minuta
34
%S
sekunda
55
%w
numer dnia tygodnia (niedziela = 0) 3
%y
rok bez wieku (00-99) i z wiekiem 12
%Y
(1990-xx)
2012