Antworten:
snprintf () schreibt nicht mehr als <Größe> (2d-Argument von snprintf) in Ihren Puffer, zählt jedoch die zusätzlichen Zeichen (und verwirft sie), die es geschrieben hätte, wenn genügend Platz vorhanden wäre, und das ist die zurückgegebene Zahl . Ja, das kann verwirrend sein!
Siehe diese snprintf () Referenz .
snprintf
in einem sehr kleinen Puffer die zurückgegebene Nummer und dann malloc
einen Puffer der entsprechenden Größe notieren und erneut ausführen könnten . Auf diese Weise wissen Sie, wie viele Bytes zugewiesen werden müssen.
snprintf
beim Messen der Länge keinen Puffer verwenden (ein Null-Zielzeiger wird explizit als gültiges Argument für den Fall destlength == 0 beschrieben).
Eine Testskizze für den Arduino Uno:
char buffer[10];
void setup() {
Serial.begin(9600);
int n = snprintf(buffer, 2, "hello");
Serial.println(n);
Serial.println(buffer);
}
void loop() {
}
Wie @JRobert schrieb, ist das "hätte" der Schlüssel. Soweit ich weiß, geben nur snprintf und vsnprintf eine "hätte" -Nummer zurück.
Ich denke, der Grund ist, feststellen zu können, ob die Zeichenfolge abgeschnitten wurde. Angenommen, der Parameter 'size' ist 25 und die Formatzeichenfolge ist sehr lang, dann kann der Rückgabewert gegen 25 getestet werden. Wenn der Rückgabewert 26 war (die Anzahl der Bytes "hätte"), wurde die Zeichenfolge abgeschnitten.
Diese Informationen konnten nicht abgerufen werden, wenn die "hätte" -Nummer nicht verfügbar war.
Zum Abschluss der Manpage für fprintf
Zustände:
Die Funktion snprintf () muss sprintf () entsprechen, wobei das Argument n hinzugefügt wird, das die Größe des Puffers angibt, auf den sich s bezieht. Wenn n Null ist, darf nichts geschrieben werden und s kann ein Nullzeiger sein. Andernfalls werden Ausgabebytes jenseits des n-1 verworfen, anstatt in das Array geschrieben zu werden, und am Ende der tatsächlich in das Array geschriebenen Bytes wird ein Nullbyte geschrieben.
und relevanter:
Nach erfolgreichem Abschluss gibt die Funktion snprintf () die Anzahl der Bytes zurück, die in s geschrieben würden, wenn n ohne das abschließende Nullbyte ausreichend groß gewesen wäre.
asdf
"Hallo" oder "h"? Wenn es "h" enthält, wurde der Parameter nicht ignoriert.