La funzione vsnprintf () in C ++ viene utilizzata per scrivere una stringa formattata in un buffer di stringhe.
A differenza di vsprintf (), il numero massimo di caratteri che possono essere scritti nel buffer è specificato in vsnprintf()
.
prototipo vsnprintf ()
int vsnprintf (char * buffer, size_t buf_size, const char * format, va_list vlist);
La vsnprintf()
funzione scrive la stringa a cui punta il formato in un buffer di stringhe di caratteri. Il numero massimo di caratteri che è possibile scrivere è buf_size. Dopo che i caratteri sono stati scritti, viene aggiunto un carattere nullo di terminazione. Se buf_size è uguale a zero, non viene scritto nulla e buffer può essere un puntatore nullo.
Il formato della stringa può contenere identificatori di formato che iniziano con% che vengono sostituiti dai valori delle variabili che vengono passati come lista vlist.
È definito nel file di intestazione.
Parametri vsnprintf ()
- buffer: puntatore a una stringa di caratteri per scrivere il risultato.
- buf_size: numero massimo di caratteri da scrivere.
- format: puntatore a una stringa terminata da null che viene scritta nel flusso di file. Consiste di caratteri insieme a identificatori di formato opzionali che iniziano con%.
Gli identificatori di formato vengono sostituiti dai valori delle rispettive variabili che seguono la stringa di formato.
L'identificatore di formato ha le seguenti parti:
- Un segno di% iniziale
- Flag: uno o più flag opzionali che modificano il comportamento di conversione.
- -: Giustifica a sinistra il risultato all'interno del campo. Per impostazione predefinita è giustificato a destra.
- +: Il segno del risultato viene aggiunto all'inizio del valore, anche in caso di risultati positivi.
- Spazio: se non è presente alcun segno, viene aggiunto uno spazio all'inizio del risultato.
- #: Viene eseguita una forma alternativa di conversione.
- 0: viene utilizzato per numeri interi e in virgola mobile. Gli zeri iniziali vengono utilizzati per riempire i numeri anziché lo spazio.
- Larghezza: un valore intero * o facoltativo utilizzato per specificare il campo di larghezza minima.
- Precisione: un campo opzionale costituito da un file. seguito da * o intero o niente per specificare la precisione.
- Lunghezza: un modificatore di lunghezza opzionale che specifica la dimensione dell'argomento.
- Specifier: un identificatore del formato di conversione. Gli identificatori di formato disponibili sono i seguenti:
Identificatore di formato Descrizione % Stampe% c Scrive un singolo carattere S Scrive una stringa di caratteri do i Converte un intero con segno in una rappresentazione decimale o Converte un intero senza segno in una rappresentazione ottale X o x Converte un intero senza segno in una rappresentazione esadecimale u Converte un intero senza segno in una rappresentazione decimale F o f Converte il numero a virgola mobile nella rappresentazione decimale E o e Converte il numero a virgola mobile nella notazione esponente decimale A o a Converte il numero a virgola mobile nell'esponente esadecimale G o g Converte il numero a virgola mobile in notazione esponente decimale o decimale n Restituisce il numero di caratteri scritti finora da questa chiamata alla funzione. Il risultato viene scritto nel valore puntato dall'argomento p Scrive una sequenza di caratteri definita dall'implementazione che definisce un puntatore. Quindi il formato generale dell'identificatore di formato è:
%(flags)(width)(.precision)(length)specifier
- vlist: un elenco di argomenti contenenti i dati da scrivere.
vsnprintf () Restituisce il valore
- In caso di successo, la
vsnprintf()
funzione restituisce il numero di caratteri scritti. - In caso di fallimento restituisce un valore negativo.
- Quando la lunghezza della stringa formattata è maggiore di buf_size, deve essere troncata. In questi casi, la
vsnprintf()
funzione restituisce il numero totale di caratteri escluso il carattere nullo di terminazione che sarebbe stato scritto, se il limite buf_size non fosse stato imposto.
Esempio: come funziona la funzione 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; )
Quando esegui il programma, l'output sarà:
C ++ è stato creato da Bjarne