格式化字符串的大小

Size of formatted string

我很难理解 snprintf 期间发生的事情。 假设我有两个数字:

int i =11; int k = 3;

我想像这样格式化它们 "[%02d] %03d\t" 并使用 snprintf。 然后我将结果字符串与 write().

一起使用

snprintf 需要 length/bytes n。 我不明白我需要提供的长度是多少... 我有两个理论:

a)

sizeof(int)*2

b) 我通过计算两个整数的位数并添加输出将包含的其他字符来检查格式化字符串将包含多少个字符:

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

-> i 的数字 + k 的数字 + 添加到第一个 int 的零 + 添加到第二个 int 的零 + tab

我很难理解什么是 "n" 我必须给 snprintf

先通过0NULL以获得准确的数量

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

是缓冲区大小

根据 documentation:

Maximum number of bytes to be used in the buffer. The generated string has a length of at most n-1, leaving space for the additional terminating null character. size_t is an unsigned integral type.

假设您写入这样的数组:

char buf[32];

缓冲区可以容纳 32 个字符(包括空终止符)。因此我们这样调用函数:

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

您还可以检查 return 值以查看已写入(或将写入)的字符数。在这种情况下,如果它大于 32,则意味着某些字符必须丢弃,因为它们不适合。

n 是您传递给 snprintf 的字符串的大小,因此它知道何时停止写入缓冲区。这是为了防止称为缓冲区溢出的一类错误。 snprintf 会将 n - 1 个字符写入传入的缓冲区,然后以空字符终止它。