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.