Uvažujme následující strukturu pro řetězec. Položka data
není zakončená 0, místo toho si pamatuje svoji délku v položce
len
.
typedef struct {
char* data;
size_t len;
} string;
Řětězce budeme vytvářet pomocí funkce (není nutno se zabývat jejím
tělem, zejména ne funkcí malloc
).
(char *cstring)
string clone_from_cstring{
= {0};
string ret .len = strlen(cstring);
retif (ret.len == 0) {
.data = 0;
ret}
else {
.data = malloc(ret.len);
ret(ret.data);
assert(ret.data, cstring, ret.len);
memcpy}
return ret;
}
Naprogramujte následující funkce
(string str, char delimiter, string* remainder); string get_prefix
Funkce vrátí prefix řetězce str
až do znaku
delimiter
, který ovšem do výsledku nepatří. Do argumentu
remainder
zapíše zbytek řetězce bez delimiteru. Tedy pokud
spojíme návratovou hodnotu, delimiter
a
remainder
dostaneme str
(vše chápáno jako
řetězce). Pokud je první symbols str
roven
delimiter
, vrací funkce prázdný řetězec. Pokud
str
delimiter neobsahuje, je výsledkem celý řetězec. Funkce
v tomto případě musí nastavit remainder
na prázdný řetězec.
Funkce vytváří novou strukturu string
, ovšem nealokuje
novou pamět pro pole typu char
, položka data
je ukazatelem do pole, na které ukazuje položka str.data
.
Stejně tak pro remainder
.
int string_to_long(string s, long* result);
Funkce převede číslo zapsané jako řetězec na long. Předpokládáme
kódování v desítkové soustavě. Číslo může být záporné. Pokud je
s
prázdný, je výsledkem převodu 0. Výsledné číslo je
zapsáno do argumentu result
. Funkce vrací 1, pokud se
povedlo číslo z řetězce převést, jinak vrací 0.
int compute_the_thing(string s, long* result);
s
je text, který obsahuje na každém řádku mezerami
oddělená celá čísla. Funkce vrací číslo, které dostane následovně: čísla
v každém řádku sečte; výsledek dostane tak, že sečte součty sudých řádků
a od toho odečte součet součtů lichých řádků. Výsledek zapíše do
result
. Pokud se část řetězce nepovede převést na číslo,
vrátí funkce 0, jinak vrací 1. Například, pokud je s
2 2
2 2 2
-2 3
jsou součty řádků 4, 6, 1
a výsledek je
-4 + 6 -1 = 1
.
Přiložený soubor (.c) se šablonou řešení a nějaké testy. (Původně byl nahrán nesprávný soubor, nyní je soubor správně. Liší se v testech případů, kdy se nedá string převést na číslo. Případné chyby, které tím vzniknou, nebudu penalizovat.)