2011-09-21 14 views
11

może ktoś wytłumaczyć mi wyjście z tego prostego programu:snprintf i sprintf wyjaśnienie

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char charArray[1024] = ""; 
    char charArrayAgain[1024] = ""; 
    int number; 

    number = 2; 

    sprintf(charArray, "%d", number); 

    printf("charArray : %s\n", charArray); 

    snprintf(charArrayAgain, 1, "%d", number); 
    printf("charArrayAgain : %s\n", charArrayAgain); 

    return 0; 
} 

a wyjście jest:

./a.out 
charArray : 2 
charArrayAgain : // Why i don't have 2 here? 

Dzięki.

Odpowiedz

28

Ponieważ snprintf potrzebuje przestrzeni dla terminatora łańcucha \ 0. Więc jeśli powiesz, że bufor ma 1 bajt długości, to nie ma miejsca na "2".

Spróbuj z snprintf(charArrayAgain, 2, "%d", number);

+1

Jak o zamiast '2', robisz' sizeof (charArrayAgain) '. – indiv

+6

zgodził, sizeof (charArrayAgain) byłoby lepiej - choć często masz wskaźnik zamiast tablicy, w którym to przypadku sizeof() nie będzie działać. –

2

Sprawdź wartość zwracana z snprintf() to będzie prawdopodobnie 2.

4
snprintf(charArrayAgain, 1, "%d", number); 
//      ^

pan określający maksymalny rozmiar bufora być jeden bajt. Jednak, aby zapisać pojedynczą cyfrę w ciąg, trzeba mieć dwa bajtów (jeden dla cyfry i jeden dla zerowej terminatorem.)

4

Powiedziałeś snprintf aby drukować tylko jeden znak do tablicy , który nie jest wystarczający do przechowywania liczby konwertowanej na łańcuch znaków (to jeden znak) i do zakończenia łańcucha \ 0, który jest drugim znakiem, więc snprintf nie może zapisać ciągu znaków w buforze, który mu dałeś.

4

Drugim argumentem dla snprintf jest maksymalna liczba bajtów do zapisania w tablicy (charArrayAgain). Zawiera zakończenie '\0', więc przy rozmiarze 1 nie napisze pustego ciągu.