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 Svoboda

strcat 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ší.

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

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

6/10