Místo v poli
Pole řetězce má pevnou velikost jako každé pole. char jmeno[] = "Anna"; má přesně 5 prvků: místo na 4 písmena a '\0', nic víc. Pokud do něj chcete později uložit delší text, dejte mu víc místa hned při vytvoření:
char prezdivka[20] = "Anna";
int velikost = sizeof(prezdivka);
int delka = strlen(prezdivka);
printf("%d %d\n", velikost, delka);Program vypíše:
20 4Pole má 20 prvků. Text zabírá prvních pět prvků i se svým '\0' a ve zbytku jsou nuly, stejně jako u int cisla[5] = {0};. Proto teď sizeof a strlen dávají různá čísla: velikost pole a délku textu, který v něm je.
Jak do pole dostat nový text? Pomocí = ne. Z lekce o polích víte, že pole nejde přiřadit najednou:
char prezdivka[20] = "Anna";
prezdivka = "Bob";main.c:5:15: error: array type 'char[20]' is not assignablePoužijte místo toho funkci strcpy (copy znamená kopírovat) z knihovny string.h. Ta zkopíruje znaky textu i s jeho '\0' do pole. Do závorek napíšete nejdřív, kam se má kopírovat, a potom, co se má kopírovat:
char prezdivka[20] = "Anna";
strcpy(prezdivka, "Bob");
printf("%s\n", prezdivka);Program vypíše:
BobPořadí je stejné jako u =: cíl je vlevo. Kratší text nevadí. Jeho '\0' označí nový konec a na tom, co v poli zůstalo za ním, už nezáleží.
Pole musí mít místo na celý text i na jeho '\0'. strcpy to nekontroluje: neví, jak velké pole je, a kopíruje, dokud nenarazí na '\0'. Když se text nevejde, zapisuje dál za konec pole, do paměti, která patří něčemu jinému. Pokud Clang vidí, že se text nevejde, program tady nepůjde přeložit:
char prezdivka[5] = "Anna";
strcpy(prezdivka, "Alexandr");main.c:6:5: error: 'strcpy' will always overflow; destination buffer has size 5, but the source string has length 9 (including NUL byte) [-Werror,-Wfortify-source]Hláška říká, že cíl (destination buffer) má místo na 5 znaků, ale text (source string) jich potřebuje 9 i s nulovým znakem (NUL byte). Clang to ale nevidí vždy, třeba když text pochází z jiného pole. Pak program nic nezastaví a pokračuje s poškozenými daty. Podobné chyby stály za mnoha bezpečnostními dírami ve skutečných programech. Před každým strcpy si proto ověřte, že se délka textu plus 1 vejde do pole.
Totéž platí pro počáteční text. Zápis char jmeno[4] = "Anna"; jazyk C dovolí, jenže na '\0' už nezbude místo, a text tak nemá konec:
char mesto[] = "Brno";
char jmeno[4] = "Anna";
printf("%s\n", jmeno);
printf("%s\n", mesto);Program vypíše:
AnnaBrno
BrnoNa prvním řádku mělo být jen Anna. printf za ním ale nenašel '\0', a tak vypisoval dál, co bylo v paměti za polem. Tady to bylo zrovna pole mesto.
Jak psát:
Pokyny
Hráč se pustil do hry. Pod printf zkopírujte do řetězce stav text "hraje hru" pomocí strcpy a vypište stav znovu stejným printf. Spusťte program: nepůjde přeložit, protože stav má místo jen na "online". Dejte poli místo na 20 znaků, char stav[20] = "online";, a spusťte program znovu. Výpis by měl končit řádkem Stav: hraje hru.
Potom hráč nechce být rušen. Zkopírujte do stav text "nerušit" a stav vypište ještě jednou: Stav: nerušit.
Začněte programovat zdarma
5/10