2016-03-29 26 views
1

Burada geçirdiğiniz zaman için teşekkürler. Ben snprintf() ile bir sorum var aşağıda koduyla size = 0,:snprintf() size = 0 iken geri dönüş değeri döndürür

#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; 
} 

Ben çalıştırdığınızda:

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

sonucudur:

this string has length 17 
./Test_snprintf 1 17 

Ne benim karıştırır Kodda, yazılacak boyut 0, neden 17 gösterilir?

ben kaçırdım ne

çözüm Return value altında in the man page bulunabilir

cevap

1

Teşekkür ~~;

fonksiyonları snprintf() ve vsnprintf() (sonlandırıcı boş byte ('\ 0') dahil) boyutu bayt fazla yazmayın. Bu sınır nedeniyle çıktı kesildiyse, yeterli değer varsa son satırına yazılacak olan karakter sayısı (sonlandırıcı boş bayt hariç) karakter sayısıdır.

Bu, daha sonra, tam olarak ne yapmak, bir "deneme baskı" Doğru uzunluğunu almak için ne sen ayrılan tampon tekrar snprintf zaman bütün çıktıyı almak için dinamik olarak tampon tahsis böylece olduğunu.

+0

Anlıyorum. Teşekkürler ~~~ – momoxinduo

+0

neden ilk snprintf bir NULL işaretçisine yazabilir? – momoxinduo

+0

@momoxinduo Sadece null değerini elde etmek için 'NULL 'öğesini geçirin, böylece gerçek baskıyı yapmak için belleği dinamik olarak ayırabilirsiniz. Tam olarak kodunuz ne yapıyor. –

İlgili konular