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

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

#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?

Спасибо.

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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