Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Druhý bonusový úkol

Odevzdání

Úkol odevzdejte mailem (adresu najdete na webu katedry), s předmětem ZP2 - Bonusový úkol 2, jako přílohu soubor se zdrojovým kódem (a nic dalšího). Odevzdávejte nejpozději 16. 3. ve 23:59.

Body

Za úkol lze získat 4 body.

Zadání

Uvažujeme strukturu String pro řetězec z prvního bonusového úkolu.

Naprogramujte následující funkci (za její korektní implementaci lze získat 2 body).

String* split_string(String str, char delimiter, int *n);

Funkce rozdělí řetězec str na části oddělené znakem delimiter, ten přitom do žádné části nepatří. Funkce vrátí takto vzniklé řetězce v nově alokovaném poli struktur String, každá z těchto struktur je klonem části původního řetězce, tj. paměť pro pole .data je nově alokována, pointer .data tedy neukazuje do pole str.data. Počet vzniklých řetězců zapíše na adresu n.

Příklady rozdělení řetězce (delimiter je '-').

"ahoj-svete"       -> "ahoj", "svete"
"ahoj--svete"      -> "ahoj", "", "svete"
"-ahoj-svete"      -> "", "ahoj", "svete"
"ahoj-svete-"      -> "ahoj", "svete", ""
"ahoj"             -> "ahoj"

Druhou částí úkolu je naprogramovat string builder (lze získat zbývající 2 body). To je objekt, do kterého se dá tisknout podobně jako na terminál, ale výsledný řetězec je uchováván v paměti. Uvnitř může string builder fungovat podobně jako dynamické pole: když do něj tiskneme a je potřeba řetězec zvětšit, paměť realokujeme.

Předpokládejme následující strukturu pro string builder.

typedef struct
{
	char *data;
	int capacity;
	int len;
} String_Builder;

Za úkol je implementovat následující funkce.

void sb_allocate(String_Builder *sb, int capacity);

Alokuje vnitřní paměť na capacity znaků. Funkce je použita pouze pro inicializaci builderu.

void sb_destroy(String_Builder *sb);

Uvolní vnitřní pamět a příslušně nastaví položky struktury.

String sb_to_string(String_Builder sb);

Vrátí obsah string builderu jako nově vytvořený String, jehož vnitřní data jsou nově alokována.

void sb_print_int(String_Builder *sb, int i);
void sb_print_cstring(String_Builder *sb, char *cs);

Funkce pro tisk do string builderu.

Ukázka použití:

String_Builder sb = {};
sb_allocate(&sb, 5);
sb_print_cstring(&sb, "test ");
sb_print_int(&sb, -3);
sb_print_cstring(&sb, " string builderu");
String str = sb_to_string(sb);
print_string(str);

Kód výše vytiskne řádek:

test -3 string builderu

Omezení

V úkolech je zakázáno používat funkcí z string.h, s výjimkou funkcí memcpy, memmove, memset.