<< , Úvod

Funkce pro práci se širokými znaky

Následující funkce jsou volitelným rozšířením dle doporučení XPG4. Bez nich však nelze se širokými znak prakticky pracovat, proto lze očekávat, že se brzy stanou standardem.

#include <wchar.h>
int iswalnum(wint_t wc);
int iswalpha(wint_t wc);
int iswcntrl(wint_t wc);
int iswdigit(wint_t wc);
int iswgraph(wint_t wc);
int iswlower(wint_t wc);
int iswprint(wint_t wc);
int iswpunct(wint_t wc);
int iswspace(wint_t wc);
int iswupper(wint_t wc);
int iswxdigit(wint_t wc);
Typ wint_t je definován v hlavičkovém souboru <wchar.h>. Kromě hodnot typu wchar_t musí být schopen reprezentovat také hodnotu WEOF, která nemusí být hodnotou typu wchar_t.
#include <wchar.h>
int iswctype(wint_t wc, wctype_t prop);
wctype_t wctype(const char *charclass);
Funkci iswctype() lze použít pro parametrizovaný test klasifikace znaků. Klasifikovaným znakem wc může být libovolný znak používaného kódu nebo hodnota WEOF. Požadovaná klasifikace je určena kódem klasifikace prop. Kód klasifikace je reprezentován celočíselným typem wctype_t. Požadovaný kód klasifikace lze získat funkcí wctype(), která převádí jméno klasifikace zadané řetězcem na kód klasifikace. Pro standardní klasifikace jsou rezervovány řetězce "alnum", "alpha", "cntrl", "digit", "graph", "lower", "print", "punct", "space", "upper" a "xdigit". Pokud není zadaná klasifikace podporována, je výsledkem funkce wctype() hodnota 0. Pro dané národní prostředí mohou být definovány libovolné další klasifikace.

Příklad:

	iswalnum(wc) == iswctype(wc, wctype("alnum"))
#include <wchar.h>
wint_t towlower(wint_t c); wint_t towupper(wint_t c);
Převod písmen z malých na velká a naopak. Parametr může mít stejný interval hodnot jako klasifikační funkce. Pokud je parametrem towlower() hodnota odpovídající kódu velkého písmene kódu nastaveného setlocale(), pak je výsledkem ekvivalentní malé písmeno. Pokud je parametrem towupper() hodnota odpovídající malému písmenu, pak je výsledkem ekvivalentní velké písmeno. V ostatních případech je výsledkem nezměněná hodnota parametru.
#include <stdio.h>
#include <wchar.h>
wint_t getwchar(void);
wchar_t *getws(wchar_t *ws);
wint_t getwc(FILE *f);
wint_t fgetwc(FILE *f);
wchar_t *fgetws(wchar_t *ws, int n, FILE *f);
wint_t putwchar(wint_t wc);
int putws(const wchar_t *ws);
wint_t putwc(wint_t wc, FILE *f);
wint_t fputwc(wint_t wc, FILE *f);
int fputws(const wchar_t *ws, FILE *f);
wint_t ungetwc(wint_t wc, FILE *f);
Tyto funkce jsou obdobou standardních funkcí pracujících s osmibitovými znaky. Jediným rozdílem je, že čtou hodnoty typu wchar_t a signalizují konec souboru a chybové stavy hodnotou wint_t WEOF.
#include <wchar.h>
wchar_t *wcscat(wchar_t *dest, const wchar_t *src);
wchar_t *wcsncat(wchar_t *dest, const wchar_t *src, size_t n);
Připojení řetězce širokých znaků src na konec řetězce širokých znaků dest. Výsledkem je adresa začátku řetězce dest. Funkce wcscat() kopíruje celý řetězec src, včetně ukončovacího znaku. Funkce wcsncat() kopíruje maximálně n širokých znaků řetězce src. Za konec kopírovaného textu vloží ukončovací znak. Ukončovací znak není zahrnut v délce n. Výsledkem funkce je adresa dest. Pokud se cílové pole a zdrojové pole překrývají, není výsledek připojení definován.
#include <wchar.h>
wchar_t *wcschr(const wchar_t *ws, wchar_t wc);
wchar_t *wcsrchr(const wchar_t *ws, wchar_t wc);
Výsledkem je adresa prvního (wcsrchr() posledního) výskytu znaku wc v řetězci ws. Ukončující znak je považován za součást řetězce, takže wcschr(ws, 0) vrátí adresu ukončujícího znaku. Pokud není znak nalezen, je výsledkem hodnota NULL.
#include <wchar.h>
int wcscmp(const wchar_t *ws1, const wchar_t *ws2);
int wcsncmp(const wchar_t *ws1, const wchar_t *ws2, size_t n);
Srovnání dvou řetězců širokých znaků ws1 a ws2. Výsledkem je hodnota 0, pokud jsou řetězce shodné, menší než 0, pokud je řetězec ws1 lexikálně menší než ws2, a hodnota větší než 0, pokud je větší. Funkce využívá nejvhodnější instrukce procesoru, není jazykově lokalizována. Výsledek je dán rozdílem kódů prvních dvou odlišných znaků. Funkce wcsncmp() srovnává maximálně n znaků.
#include <wchar.h>
int wcscoll(const wchar_t *ws1, const wchar_t *ws2);
Jazykově závislé srovnání dvou řetězců ws1 a ws2. Výsledek srovnání je obdobný jako u funkce wcscmp(): hodnota 0 pro stejné řetězce, menší než 0 pro řetězec ws1 menší než ws2 a hodnota větší než 0 pro větší. Funkce může skončit chybou, ale pro indikaci chyby není rezervována žádná hodnota výsledku. Chybu lze rozpoznat pouze testem proměnné errno.
#include <wchar.h>
wchar_t *wcscpy(wchar_t *dest, const wchar_t *src);
wchar_t *wcsncpy(wchar_t *dest, const wchar_t *src, size_t n);
Kopie řetězce src do pole zadaného dest. Výsledkem je adresa začátku řetězce dest. Funkce wcscpy() kopíruje celý řetězec src, včetně ukončovacího znaku. Funkce wcsncpy() kopíruje maximálně n znaků. Pokud je kopírovaný řetězec delší, není cílový řetězec ukončen ukončovacím znakem. Pokud je řetězec kratší, je cílové pole doplněno ukončovacími znaky do délky wc. Pokud se cílové pole a zdrojové pole překrývají, není výsledek kopie definován.
#include <wchar.h>
size_t wcsspn(const wchar_t *ws1, const wchar_t *ws2);
size_t wcscspn(const wchar_t *ws1, const wchar_t *ws2);
Výsledkem funkce wcsspn() je délka počáteční sekvence znaků řetězce ws1, která se skládá pouze ze znaků obsažených v řetězci ws2. Výsledkem funkce wcscspn() je délka sekvence složené ze znaků, které nejsou obsaženy v řetězci ws2.
#include <wchar.h>
size_t wcslen(const wchar_t *ws);
Výsledkem je délka řetězce širokých znaků. Délka nezahrnuje ukončující znak.
#include <wchar.h>
wchar_t *wcspbrk(const wchar_t *ws1, const wchar_t *ws2);
Funkce hledá první výskyt některého znaku z řetězce ws2 v řetězci ws1. Výsledkem je adresa nalezeného výskytu znaku v řetězci ws1. Pokud není nalezen, je výsledkem hodnota NULL.
#include <wchar.h>
wchar_t *wcstok(wchar_t *ws1, const wchar_t *ws2);
Funkce vyhledává v řetězci ws1 úseky oddělené oddělovači definovanými řetězcem ws2. Při prvním volání funkce je vyhledán v řetězci ws1 první znak, který není uveden v řetězci ws2. Tento znak tvoří začátek prvního hledaného úseku. Dále je vyhledán znak ukončující úsek, což je první znak ze řetězce ws2. Na jeho místo je uložen ukončovací znak a jeho pozice je interně zapamatována. Výsledkem funkce je adresa začátku úseku. Protože byl znak ukončující úsek nahrazen ukončovačem řetězce, tvoří výsledek řetězec, který obsahuje pouze hledaný úsek. Při následujícím prohledávání stejného řetězce musí být funkce volána s hodnotou prvního parametru rovnou NULL. Funkce tak pokračuje v hledání dále od uschované pozice. Pokud není nalezen další úsek, je výsledkem hodnota NULL. Řetězec oddělovacích znaků se může při každém volání lišit, není interně pamatován. Funkce může prohledávat v daný okamžik pouze jeden řetězec, interně uschovanou pozici konce aktuálního úseku nelze programově získat, ani nastavit.
#include <wchar.h>
size_t wcsxfrm(wchar_t *ws1, const wchar_t *ws2, size_t maxsize);
Transformace řetězce ws2 podle definice jazykově závislého řazení. Transformovaný řetězec je uložen do pole ws1. Parametr maxsize určuje maximální délku transformovaného řetězce v širokých znacích, včetně ukončujícího znaku. Výsledkem funkce je délka transformovaného řetězce bez ukončujícího znaku. Pokud je délka větší nebo rovna maxsize, je obsah ws1 nedefinovaný. Volání s parametrem maxsize rovným 0 lze použít pro zjištění potřebné velikosti pole ws1. Transformovaný řetězec může být srovnáván funkcí wcscmp() s jinými transformovanými řetězci získanými funkcí wcsxfrm(). Výsledek srovnání bude ekvivalentní volání funkce wcscoll() na původní řetězce, tedy jazykově lokalizovaný.
#include <wchar.h>
wchar_t *wcswcs(const wchar_t *ws1, const wchar_t *ws2);
Vyhledání řetězce ws2 v řetězci ws1. Výsledkem je adresa začátku nalezeného řetězce v řetězci ws1. Pokud není řetězec nalezen, je výsledkem hodnota NULL.
#include <wchar.h>
int wcwidth(const wchar_t wc);
Výsledkem funkce wcwidth() je šířka výstupu ve znakových pozicích, kolik by zabral výpis znaku wc. Pokud je znak nezobrazitelný, je výsledkem -1.
#include <wchar.h>
int wcswidth(const wchar_t *pwcs, size_t n);
Výsledkem je šířka výstupu ve znakových pozicích, kolik by zabral výpis prvních n širokých znaků řetězce pwcs. Pokud je n větší než délka řetězce, je počet znaků omezen ukončovacím znakem. Pokud je některý znak nezobrazitelný, je výsledkem -1.


<< , Úvod
Poslední změna: 1. June 1998
Pokud máte námět na vylepšení této stránky nebo na ní naleznete chybu, zašlete dopis na adresu lampa@fee.vutbr.cz.