Naprogramujte vlastní verze knihovních funkcí strlen
a strcmp (string.h), které nepoužijí indexů,
ale pouze pointerové aritmetiky a dereference.
Vytvořte strukturu s několika položkami a aspoň jednu její proměnnou. Vypište informace o layoutu této proměnné: pro každou položku vypište její adresu a velikost. Vypište i adresu a velikost samotné proměnné.
Naprogramujte funkci pro výpočet průměru a mediánu pole čísel (např. float). Jednu z hodnot vraťte pomocí argumentu předaného odkazem. (Funkce může změnit pořadí prvků v poli.)
Napište funkci swap_int, která prohodí hodnoty dvou
proměnných typu int.
Napište funkci, která v poli řetězců najde znak, který se vyskytuje v nejvíce řetězcích v tomto poli.
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).
String clone_from_cstring(char *cstring)
{
String ret = {0};
ret.len = strlen(cstring);
if (ret.len == 0) { ret.data = 0; }
else
{
ret.data = malloc(ret.len);
assert(ret.data);
memcpy(ret.data, cstring, ret.len);
}
return ret;
}Naprogramujte následující funkce
String get_prefix(String str, char delimiter, String* remainder);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.