Risposte:
snprintf () non scriverà più di <size> (secondo argomento di snprintf) caratteri nel buffer, ma conta (e scarta gli extra) che avrebbe scritto, se ci fosse stato abbastanza spazio, e questo è il numero che restituisce . Sì, può essere fonte di confusione!
Vedi questo riferimento snprintf () .
snprintf
un buffer molto piccolo, annotare il numero restituito, quindi malloc
un buffer della dimensione appropriata e farlo di nuovo. In questo modo sai quanti byte assegnare.
snprintf
bufferizzare in alcun modo (un puntatore di destinazione null viene esplicitamente descritto come argomento valido per il caso destlength == 0) quando si misura la lunghezza.
Uno schizzo di prova per Arduino Uno:
char buffer[10];
void setup() {
Serial.begin(9600);
int n = snprintf(buffer, 2, "hello");
Serial.println(n);
Serial.println(buffer);
}
void loop() {
}
Come ha scritto @JRobert, il "avrebbe" è la chiave. Per quanto ne so solo snprintf e vsnprintf restituiscono un numero "avrebbe".
Penso che il motivo sia quello di poter dire se la stringa è stata troncata. Supponiamo che il parametro 'size' sia 25 e che la stringa di formato sia molto lunga, quindi il valore di ritorno può essere testato rispetto a 25. Se il valore di ritorno era 26 (il "avrebbe" numero di byte), allora la stringa veniva troncata.
Non è stato possibile recuperare queste informazioni quando il numero "avrebbe" non era disponibile.
Per il completamento, la pagina man per gli fprintf
stati:
La funzione snprintf () deve essere equivalente a sprintf (), con l'aggiunta dell'argomento n che indica la dimensione del buffer a cui fa riferimento s. Se n è zero, nulla deve essere scritto e s può essere un puntatore nullo. Altrimenti, i byte di output oltre il n-1 devono essere eliminati anziché essere scritti nell'array e un byte null viene scritto alla fine dei byte effettivamente scritti nell'array.
e, più pertinente:
In caso di completamento con esito positivo, la funzione snprintf () deve restituire il numero di byte che verrebbero scritti in s se non fosse stato sufficientemente grande, escluso il byte null terminante.
asdf
contiene "ciao" o "h"? Se contiene "h", il parametro non è stato ignorato.