格式化字符串的大小

时间:2018-11-23 13:43:00

标签: c printf sizeof

我正在努力了解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的位数+在第一个int中添加的零+零在第二个int +制表符中添加的

我正在努力理解我必须给snprintf的“ n”是什么

3 个答案:

答案 0 :(得分:2)

先通过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

答案 1 :(得分:2)

这是缓冲区大小

根据documentation

  

缓冲区中要使用的最大字节数。生成的字符串   的长度最多为n-1,为额外的空间留出空间   终止空字符。 size_t是无符号整数类型。

假设您写入这样的数组:

char buf[32];

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

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

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

答案 2 :(得分:2)

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