Funkce vsnprintf () v C ++ se používá k zápisu formátovaného řetězce do vyrovnávací paměti řetězce.
Na rozdíl od vsprintf () je zadán maximální počet znaků, které lze zapsat do vyrovnávací paměti vsnprintf()
.
prototyp vsnprintf ()
int vsnprintf (char * buffer, size_t buf_size, const char * format, va_list vlist);
vsnprintf()
Funkce zapíše řetězec odkazuje formátu do znakového řetězce vyrovnávací paměti. Maximální počet znaků, které lze zapsat, je buf_size. Po napsání znaků se přidá ukončovací prázdný znak. Pokud se buf_size rovná nule, nic se nezapíše a buffer může být nulovým ukazatelem.
Formát řetězce může obsahovat specifikátory formátu začínající na%, které jsou nahrazeny hodnotami proměnných, které jsou předávány jako seznam vlist.
Je definován v hlavičkovém souboru.
Parametry vsnprintf ()
- buffer: Ukazatel na řetězec znaků, který zapíše výsledek.
- buf_size: Maximální počet znaků pro zápis.
- formát: Ukazatel na řetězec s nulovým zakončením, který je zapsán do proudu souboru. Skládá se ze znaků a volitelných specifikátorů formátu začínajících na%.
Specifikátory formátu jsou nahrazeny hodnotami příslušných proměnných, které následují za formátovacím řetězcem.
Specifikátor formátu má následující části:
- Přední znak%
- Příznaky: Volitelný jeden nebo více příznaků, které upravují chování převodu.
- -: Vlevo zarovná výsledek v poli. Ve výchozím nastavení je to správně zarovnané.
- +: Znaménko výsledku je připojeno na začátek hodnoty, a to i pro pozitivní výsledky.
- Mezera: Pokud není žádná značka, na začátek výsledku se připojí mezera.
- #: Je provedena alternativní forma převodu.
- 0: Používá se pro celé číslo a číslo s plovoucí desetinnou čárkou. K vyplnění čísel místo mezery se používají úvodní nuly.
- Šířka: Volitelná * nebo celočíselná hodnota použitá k určení pole minimální šířky.
- Přesnost: Volitelné pole skládající se z a. následuje * nebo celé číslo nebo nic k určení přesnosti.
- Délka: Volitelný modifikátor délky, který určuje velikost argumentu.
- Specifikátor: Specifikátor formátu převodu. Dostupné specifikátory formátu jsou následující:
Specifikátor formátu Popis % Tisky% C Zapíše jeden znak s Zapíše řetězec znaků d nebo i Převede celé číslo se znaménkem na desítkové vyjádření Ó Převede celé číslo bez znaménka na osmičkovou reprezentaci X nebo x Převede celé číslo bez znaménka na šestnáctkové vyjádření u Převede celé číslo bez znaménka na desítkové vyjádření F nebo f Převede číslo s plovoucí desetinnou čárkou na desítkové vyjádření E nebo e Převede číslo s plovoucí desetinnou čárkou na desítkovou notaci exponentu A nebo a Převede číslo s plovoucí desetinnou čárkou na hexadecimální exponent G nebo g Převede číslo s plovoucí desetinnou čárkou na desítkovou nebo desítkovou notaci n Vrátí počet znaků doposud zapsaných tímto voláním funkce. Výsledek se zapíše na hodnotu, na kterou odkazuje argument p Zapíše posloupnost znaků definovanou implementací definující ukazatel. Obecný formát specifikátoru formátu je tedy:
%(flags)(width)(.precision)(length)specifier
- vlist: Seznam argumentů obsahujících data k zápisu.
vsnprintf () Návratová hodnota
- Pokud je úspěšná,
vsnprintf()
funkce vrátí počet zapsaných znaků. - Při selhání vrátí zápornou hodnotu.
- Pokud je délka formátovaného řetězce větší než buf_size, je třeba jej zkrátit. V takových případech
vsnprintf()
funkce vrací celkový počet znaků s výjimkou ukončujícího nulového znaku, který by byl zapsán, pokud nebyl zaveden limit buf_size.
Příklad: Jak funguje funkce vsnprintf ()
#include #include void write(char* buf, int buf_size, const char *fmt,… ) ( va_list args; va_start(args, fmt); vsnprintf(buf, buf_size, fmt, args); va_end(args); ) int main () ( char buffer(100); char fname(20) = "Bjarne"; char lname(20) = "Stroustrup"; char lang(5) = "C++"; write(buffer, 27, "%s was created by %s %s", lang, fname, lname); printf("%s", buffer); return 0; )
Když spustíte program, výstup bude:
C ++ vytvořil Bjarne