Vytvoření nového řetězce
gchar* g_strdup(const gchar *str);
Funkce g_strdup() vyrobí duplikát řetězce str – vrátí nově alokovanou kopii řetězce str. Je-li str rovno NULL, vrátí také NULL. Vrácený řetězec by měl být po použití dealokován (třeba funkcí g_free()).
gchar* g_strndup(const gchar *str, guint n);
…alokuje v paměti nový řetězec a zkopíruje do něj prvních n znaků z řetězce str. Jestliže je str NULL, jednoduše vrátí NULL. Vrácený řetězec by měl být dealokován, když už nebude potřeba.
gchar* g_strnfill(guint length, gchar fill_char);
Tato funkce se postará o vytvoření řetězce délky length a celého vyplněného znakem fill_char. Po použití by měl být řetězec dealokován.
gchar* g_strdup_printf(const gchar *format, ...);
…vytvoří nový řetězec, jehož formát je dán řetězcem format a dalšími případnými parametry. Rutina je podobná funkci sprintf() ze standardního jazyka C. g_strdup_printf() je však bezpečnější, protože si vypočítává maximální velikost výsledku a podle toho alokuje potřebnou paměť. Vrácený řetězec by měl být po použití dealokován.
gchar* g_strdup_vprintf(const gchar *format, va_list args);
…tato funkce je podobná standardní vsprintf(), je však bezpečnější, protože si vypočítává délku výsledku a podle toho alokuje paměť pro nový řetězec formátu format. Vrácený řetězec vždy nakonec dealokujte.
Pro úplnost je zde třeba doplnit ještě tři funkce, pracující s existujícími řetězci. Jejich podobnost s předchozími funkcemi je natolik velká, že bude lepší, uvedu-li je na tomto místě:
gint g_snprintf(gchar *string, gulong n,
const gchar *format, ...);
…toto je bezpečnější náhrada standardní funkce sprintf(). Je garantováno, že výstup nebude delší než n znaků (včetně ukončovacího ‚\0‘ znaku). Nemůže tedy dojít k zápisu mimo vyhrazenou paměť. Funkce vrací délku výstupního řetězce string (včetně ukončovacího nulového znaku).
gint g_vsnprintf(gchar *string, gulong n,
const gchar *format, va_list args);
…tato funkce je bezpečnější formou funkce vsprintf(). Výstup včetně ukončovacího nulového znaku ( ‚\0‘) nebude delší než n znaků, takže nemůže nastat zápis mimo vyhrazenou paměť. Funkce vrátí délku výstupního řetězce string (včetně ukončovacího nulového znaku).
guint g_printf_string_upper_bound(const gchar *format,
va_list args);
…vypočítá a vrátí maximální velikost paměti, které je třeba k uložení výstupu funkce vsprintf() (viz manuál k jazyku C).
Porovnávání
gint g_strcasecmp(const gchar *s1, const gchar *s2);
Tato funkce implementuje tzv. case-insensitive porovnání (velká a malá písmena jsou chápána jako stejná). Rutina porovná řetězec s1 s řetězcem s2 a vrátí 0, jsou-li řetězce shodné, zápornou hodnotu, jestliže s1 < s2 (lexikograficky), nebo kladnou hodnotu, je-li s1 > s2.
gint g_strncasecmp(const gchar *s1, const gchar *s2, guint n);
…je podobná předchozí funkci s tím rozdílem, že porovnává pouze prvních n znaků. Při porovnávání se nerozlišují velká a malá písmena. Funkce vrátí 0, jestliže jsou řetězce shodné, zápornou hodnotu, jestliže s1 < s2 (lexikograficky), nebo kladnou hodnotu, je-li s1 > s2.
Příklad:
/* zkouska case-insensitive porovnavani */
#include <glib.h>
gint main(void) {
if (g_strcasecmp("Ahoj!", "AHOJ!") == 0)
puts("Retezce jsou stejne!");
if (g_strncasecmp("Ahoj, jak se mame?", "AHOJ!", 4) == 0)
puts("Retezce jsou stejne!");
return(0);
}
Spustíte-li si tento příklad, mělo by se dvakrát vypsat hlášení „ Retezce jsou stejne!“.
Různé konverze
void g_strup(gchar *string);
…zkonvertuje znaky v řetězci string na velká písmena abecedy.
void g_strdown(gchar *string);
…provede konverzi znaků ve string u na malá písmena abecedy.
void g_strreverse(gchar *string);
…zrcadlově převrátí řetězec string (jakoby se četl pozpátku). Například volání g_strreverse() na řetězec "Abcdef" bude mít za následek text "fedcbA".
Chcete-li zkonvertovat řetězec na číselnou hodnotu typu gdouble, zavolejte raději místo standardní funkce strtod() funkci
gdouble g_strtod(const gchar *nptr, gchar **endptr);
Tato funkce se pokusí voláním strtod() zkonvertovat řetězec nptr na návratovou hodnotu gdouble. Není-li řetězec kompletně zkonvertován, pokusí se o konverzi ještě jednou s použitím C locales a vrátí lepší výsledek. V případě neúplné konverze vrátí v endptr pointer na první znak, který nebyl v konverzi použit. Jinak endptr nastaví na NULL.
Příklad:
/* zkouska funkce g_strtod */
#include <glib.h>
gint main(void) {
gchar *s; /* zdrojovy retezec */
gchar *t; /* pomocny retezec */
gdouble num; /* zkonvertovane cislo */
s = "311211234.23 kilometru";
num = g_strtod(s, &t); /* konverze - promenna t nyni ukazuje
* na 1. neciselny znak retezce s */
printf("Cislo: %lf, za nim je: %s\n", num, t);
return(0);
}
Zkompilujete-li a spustíte tento program, měl by v pořádku zkonvertovat řetězec s na číslo a to uložit do proměnné num. Proměnná t by po volání g_strtod() měla ukazovat na první nečíselný znak řetězce s. Kontrolní výpis by měl vypsat:
Cislo: 311211234.230000, za nim je: kilometru
…přičemž mezi „ je:“ a „ kilometru“ by měly být dvě mezery.
gchar* g_strescape(gchar *string);
…tato funkce nahradí všechny výskyty zpětného lomítka ( '\') v řetězci string dvojicí zpětných lomítek ( "\\"). Funkce vrátí nově alokovaný řetězec s provedenou konverzí. Původní řetězec string zůstane nedotčen. Vrácený řetězec byste měli po použití dealokovat funkcí g_free() (viz předchozí díl).
A to je pro dnešek vše. V příštím díle povídání o řetězcích ukončených nulou dokončíme.