2016-03-29 5 views
1

Vielen Dank für Ihre Zeit zum ersten Mal hier verbracht. Ich habe eine Frage mit snprintf(), wenn size = 0, mit dem Code unten:snprintf() Rückgabewert, wenn size = 0

#include <stdio.h> 
#include <stdlib.h> 

int main(int ac, char **av) 
{ 
    char *str; 
    int len; 

    len = snprintf(NULL, 0, "%s %d", *av, ac); 
    printf("this string has length %d\n", len); 

    if (!(str = malloc((len + 1) * sizeof(char)))) 
     return EXIT_FAILURE; 

    len = snprintf(str, len + 1, "%s %d", *av, ac); 
     printf("%s %d\n", str, len); 

    free(str); 

    return EXIT_SUCCESS; 
} 

wenn ich laufe:

[email protected]:~/TestCode$ ./Test_snprintf 

Das Ergebnis ist:

this string has length 17 
./Test_snprintf 1 17 

Was mich verwirrt ist im Code ist die zu schreibende Größe 0, warum 17 angezeigt?

Was habe ich verpasst

Dank ~~

Antwort

1

Die Lösung kann in the man page unter Return value finden?;

Die Funktionen snprintf() und vsnprintf() nicht schreiben mehr als Größe Bytes (einschließlich des abschließenden Nullbyte ('\ 0')). Wenn der Ausgang aufgrund dieser Grenze abgeschnitten wurde, dann ist der Rückgabewert die Anzahl der Zeichen (mit Ausnahme des abschließenden Nullbytes), die auf die endgültige Zeichenfolge geschrieben worden wären, wenn genügend Platz vorhanden gewesen war.

Dies ist so, dass Sie genau das tun können, was Sie tun, ein „Probedruck“ die richtige Länge zu erhalten, dann den Puffer zuweisen dynamisch die gesamte Ausgabe zu erhalten, wenn Sie wieder an den zugewiesenen Puffer snprintf.

+0

ich sehe. Danke ~~~ – momoxinduo

+0

Warum kann der erste snprintf auf einen Nullzeiger schreiben? – momoxinduo

+0

@momoxinduo Sie übergeben 'NULL', um nur die Länge zu erhalten, so dass Sie dynamisch Speicher für den tatsächlichen Druck zuweisen können. Genau was dein Code macht. –