Spojování řetězců
Často potřebujete text poskládat z kousků: jméno a příjmení, pozdrav a jméno. Funkce strcat (concatenate znamená spojit, zřetězit) z knihovny string.h přidá text na konec textu, který už v poli je:
char cele_jmeno[30] = "Petr";
strcat(cele_jmeno, " ");
strcat(cele_jmeno, "Svoboda");
printf("%s\n", cele_jmeno);Program vypíše:
Petr Svobodastrcat najde '\0' na konci řetězce cele_jmeno a od tohoto místa zkopíruje nový text i s jeho '\0'. Pořadí je stejné jako u strcpy: nejdřív pole, které se mění, potom text, který se přidává. Druhý text zůstane, jak byl.
Obvykle se začíná prázdným řetězcem "", ve kterém je jen '\0', a kousky se přidávají jeden po druhém. To se hodí hlavně v cyklu:
char hvezdicky[10] = "";
for (int i = 0; i < 3; i++) {
strcat(hvezdicky, "*");
printf("%s\n", hvezdicky);
}Program vypíše:
*
**
***Pole musí mít místo na všechno: na text, který už v něm je, na nový text a na jeden '\0'. "Petr Svoboda" potřebuje 4 + 1 + 7 + 1 = 13 prvků, takže cele_jmeno[30] bohatě stačí. Stejně jako u strcpy program tady nepůjde přeložit, když Clang vidí, že se nový text nevejde:
char pozdrav[8] = "Ahoj";
strcat(pozdrav, ", Karle!");main.c:6:5: error: 'strcat' will always overflow; destination buffer has size 8, but the source string has length 9 (including NUL byte) [-Werror,-Wfortify-source]Clang přitom kontroluje jen nový text. Když už je pole částečně plné, problém často nevidí a strcat bez jediného slova zapíše znaky za konec pole. Proto si před spojováním spočítejte, kolik místa je potřeba, a když si nejste jistí, udělejte pole větší.
Jak psát:
Pokyny
Před posledním printf spojte do řetězce cele_jmeno jméno, mezeru a příjmení. Použijte třikrát strcat. Výpis by měl být Jméno: Karel Marek.
Pod to vytvořte char smich[20] = ""; a v cyklu for, který proběhne čtyřikrát, do něj přidávejte "cha". Za cyklem ho vypište: chachachacha.
Začněte programovat zdarma
6/10