Размер отформатированной строки - PullRequest
0 голосов
/ 23 ноября 2018

Я изо всех сил пытаюсь понять, что происходит во время snprintf.Допустим, у меня есть два числа:

int i =11; int k = 3;

Я хочу отформатировать их как "[%02d] %03d\t" и использовать snprintf.После этого я использую полученную строку с write().

snprintf нужна длина / байты n.Я не понимаю, какую длину мне нужно предоставить ... У меня есть 2 теории:

a) Это

sizeof(int)*2

b) Я проверяю, сколько символов будет отформатированной строкисодержать путем подсчета цифр двух целых чисел и добавления других символов, которые будут иметь выходные данные:

2*sizeof(char) + 1*sizeof(char) + 2*sizeof(char) + 3*sizeof(char)+ 1*sizeof(char)

-> цифры i + цифры k + нулей, добавленные к первому целому + нули, добавленные ко второму целому+ tab

Я изо всех сил пытаюсь понять, что "n" я должен дать snprintf

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Это размер буфера

Согласно документации :

Максимальное количество байтов, которые будут использоваться в буфере.Сгенерированная строка имеет длину не более n-1, оставляя место для дополнительного завершающего нулевого символа.size_t - целочисленный тип без знака.

Предположим, вы записываете в массив, такой как:

char buf[32];

В буфере может храниться 32 символа (включая нулевой терминатор).Поэтому мы вызываем функцию следующим образом:

snprintf (buf, 32, "[%02d] %03d\t", i, k); 

Вы также можете проверить возвращаемое значение, чтобы увидеть, сколько символов было записано (или было бы написано).В этом случае, если он больше 32, это будет означать, что некоторые символы должны быть отброшены, потому что они не подходят.

0 голосов
/ 23 ноября 2018

n - это размер строки, которую вы передаете в snprintf, поэтому он знает, когда прекратить запись в буфер.Это необходимо для предотвращения категории ошибок, известной как переполнение буфера.snprintf запишет n - 1 символов в переданный буфер и завершит его нулевым символом.

0 голосов
/ 23 ноября 2018

Сначала наберите 0 и NULL, чтобы получить точную сумму

int n = snprintf(NULL, 0, "[%02d] %03d\t", i, k);

Затем вы знаете, что вам нужно n + 1

char *buf = malloc(n + 1);
snprintf(buf, n + 1, "[%02d] %03d\t", i, k);
free(buf);

См. На ideone: https://ideone.com/pt0cOQ

...