2011-09-21 27 views
11

puede que alguien me explique la salida de este sencillo programa:snprintf y sprintf explicación

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

Y la salida es:

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

Gracias.

Respuesta

28

Debido snprintf necesidades de espacio para el \ 0 terminador de la cadena. Entonces, si le dices que el buffer es de 1 byte de largo, entonces no hay espacio para el '2'.

intento con snprintf(charArrayAgain, 2, "%d", number);

+1

¿Qué tal si en vez de '2', haces' sizeof (charArrayAgain) '. – indiv

+6

estuvo de acuerdo, sizeof (charArrayAgain) sería mejor, aunque a menudo tiene un puntero en lugar de una matriz, en cuyo caso sizeof() no va a funcionar. –

2

Comprobar el valor de retorno de la snprintf() es probable que sea 2.

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

Estás especificar el tamaño máximo de los topes sea de un byte. Sin embargo, para almacenar un solo dígito en una cadena, debe tener dos bytes (uno para el dígito, y otro para el terminador nulo.)

4

le he dicho snprintf imprimir sólo un único carácter en la matriz , que no es suficiente para contener el número convertido en cadena (es decir, un carácter) y el terminador de cadena \ 0, que es un segundo carácter, por lo que snprintf no puede almacenar la cadena en el búfer que le ha asignado.

4

El segundo argumento para snprintf es la cantidad máxima de bytes que se escriben en la matriz (charArrayAgain). Incluye la terminación '\0', por lo que con un tamaño de 1 no va a escribir una cadena vacía.