Ответ 1
Поскольку snprintf требуется пространство для терминатора \0 для строки. Поэтому, если вы скажете, что буфер длится 1 байт, тогда нет места для "2".
Попробуйте с snprintf(charArrayAgain, 2, "%d", number);
может кто-нибудь объяснить мне выход этой простой программы:
#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?
Спасибо.
Поскольку snprintf требуется пространство для терминатора \0 для строки. Поэтому, если вы скажете, что буфер длится 1 байт, тогда нет места для "2".
Попробуйте с snprintf(charArrayAgain, 2, "%d", number);
snprintf(charArrayAgain, 1, "%d", number);
// ^
Вы указываете максимальный размер буфера на один байт. Однако, чтобы сохранить одну строку в строке, вы должны иметь два байта (один для цифры и один для нулевого терминатора).
Вы сказали snprintf
напечатать только один символ в массиве, чего недостаточно для хранения числа, преобразованного в строку (этот символ), и ограничителя строк \0, который является вторым символом, поэтому snprintf не может сохранить строку в буфер, который вы ему дали.
Второй аргумент snprintf
- максимальное количество байтов, которые должны быть записаны в массив (charArrayAgain
). Он включает в себя завершающий '\0'
, поэтому с размером 1 он не собирается писать пустую строку.
Проверить возвращаемое значение из snprintf(), вероятно, будет 2.