объяснение snprintf и sprintf - PullRequest
       29

объяснение snprintf и sprintf

11 голосов
/ 21 сентября 2011

Может кто-нибудь объяснить мне вывод этой простой программы:

#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.out 
charArray : 2
charArrayAgain : // Why i don't have 2 here?

Спасибо.

Ответы [ 5 ]

28 голосов
/ 21 сентября 2011

Поскольку snprintf требуется место для терминатора \ 0 строки. Поэтому, если вы скажете, что длина буфера составляет 1 байт, для '2' нет места.

Попробуйте с snprintf(charArrayAgain, 2, "%d", number);

4 голосов
/ 21 сентября 2011

Второй аргумент snprintf - это максимальное количество байтов, которое будет записано в массив (charArrayAgain).Он включает в себя завершающий символ '\0', поэтому при размере 1 он не будет писать пустую строку.

4 голосов
/ 21 сентября 2011

Вы сказали snprintf печатать в массиве только один символ, которого недостаточно для хранения преобразованного в строку числа (это один символ) и разделителя строки \ 0, который является вторым символом,snprintf не может сохранить строку в указанном вами буфере.

4 голосов
/ 21 сентября 2011
snprintf(charArrayAgain, 1, "%d", number);
//                       ^

Вы указываете максимальный размер буфера в один байт. Однако для хранения одной цифры в строке необходимо иметь два байта (один для цифры и один для нулевого терминатора.)

2 голосов
/ 21 сентября 2011

Проверьте возвращаемое значение из snprintf (), вероятно, будет 2.

...