| ← dynamická paměť | C/C++ | knihovna time.h → |
V předchozím výkladu syntaxe jazyka C jsme využívali některých standardních knihoven a jejich funkcí, například printf() a scanf(). Další funkce, se kterými jsme se seznámili, byli například funkce rand() a srand(), nebo třeba funkce atoi(). Mimoto jsme se setkali i s funkcemi implementačně závislými (delay() a usleep()). V této a dalších kapitolách se budeme věnovat nejpoužívanějším standardním funkcím ze standardních knihoven. Nebudu vypisovat všechny funkce (a ani všechny knihovny). Jejich popis, a mnohde i příklady použití, najdete v dokumentaci k překladači. Začneme něčím jednodušším, a to funkcemi pracujícími s řetězci. Tyto funkce jsou definovány v knihovně <string.h>. Jen připomínám, že řetězce jsou datové pole obsahující znaky, které jsou zakončeny zarážkou '\0'.
Vzhledem ke zjednodušení popisu se nebudu vyjadřovat exaktně a například místo „řetězec, na který ukazuje ptr“ budu psát „řetězec ptr“. Doufám, že tím nezpůsobím příliš zmatků :-). A ještě připomínám, že typ size_t je ekvivalent typu unsigned int.
Pokud funkce někam kopírují / přidávají data, nekontrolují, zda na to mají dostatek místa. To musíte zajistit vy, jako programátoři. Jinak se může snadno stát, že program skončí kvůli „neoprávněnému přístupu do paměti“.
Nemusím snad říkat, že je třeba v programu deklarovat knihovnu <string.h>, pokud chceme používat funkce z této knihovny. Všimněte si především použití funkce strncpy(). Díky zjištění délky prvního řetězce a velikosti pole1 jsme mohli zajistit, aby se z pole2 nezkopírovalo více znaků, než kolik se jich do pole1 vejde.
1: /*------------------------------------------------*/ 2: /* retezce.c */ 4: #include <stdio.h> 5: #include <string.h> 7: int main(void) 8: { 9: char c, *ch, pole1[81], pole2[81]; 10: int x; 12: printf("Zadejte jeden znak a stisknete ENTER: "); 13: scanf("%c", &c); 14: printf("Zadejte prvni retezec: "); 15: scanf("%80s", pole1); 16: printf("Zadejte druhy retezec: "); 17: scanf("%80s", pole2); 19: x = strcmp(pole1, pole2); 20: if (x < 0) 21: printf("pole1 < pole2\n"); 22: else if (x == 0) 23: printf("pole1 = pole2\n"); 24: else 25: printf("pole1 > pole2\n"); 27: printf("Prvnich %i znaku se %s\n", 5, 28: !strncmp(pole1, pole2, 5) ? "schoduje" : "neschoduje"); 29: printf("Schoduje se presne %i znaku\n", strspn(pole1, pole2)); 31: ch = strchr(pole1, c); 32: if (ch == NULL) 33: printf("Znak %c se v retezci \"%s\" nenachazi\n", c, pole1); 34: else 35: printf("pole1 od znaku %c: %s\n", c, ch); 37: x = strlen(pole1); 38: printf("Delka prvniho retezce: %u\n", x); 39: strncat(pole1, pole2, sizeof(pole1) - x - 1); 40: printf("Spojeni: %s\n", pole1); 42: return 0; 43: } 45: /*------------------------------------------------*/
Možný výstup z programu:
Zadejte jeden znak a stisknete ENTER: y
Zadejte prvni retezec: DlouhyRetezec
Zadejte druhy retezec: Dlouze
pole1 < pole2 // protoze h < z
Prvnich 5 znaku se neschoduje
Schoduje se presne 4 znaku
pole1 od znaku y: yRetezec
Delka prvniho retezce: 13
Spojeni: DlouhyRetezecDlouze
| ← dynamická paměť | C/C++ | knihovna time.h → |
