C如何知道printf的输出字符串大小?

时间:2012-07-08 17:05:16

标签: c

printf("%s%d%c", s, a, c);

字符串将打印在标准输出上;但实现如何知道定义什么 要保存结果的char数组的大小?

或者替代方法是:使用固定大小的缓冲区,处理格式字符串后面的每个变量参数,如果解释的字符串大小超过缓冲区大小,则将其输出到输出流。这是真的吗?

顺便说一句,我认为,C ++中的字符串类型,它的实现使用堆内存,动态内存分配器,就像newdelete一样,这是正确的吗?

3 个答案:

答案 0 :(得分:4)

  

字符串将打印在标准输出上

这是对的。哪个是,不需要char []。只有sprintf()才需要猜测字符串缓冲区大小。

答案 1 :(得分:1)

正如其他人所解释的那样,printf不需要提前知道某个输出缓冲区的大小,因为在写入FILE*流时不需要分配一个输出缓冲区。 / p>

但是,您可能会想知道:printf - 写入FILE*个流的系列中的函数怎么样?那么,返回分配字符串的非标准asprintf函数呢?

printf系列函数的底层实现可以进行干运行。也就是说,它可以模拟执行操作而无需实际写入内存并跟踪写入的char的数量。一旦计算出该数字,它就可以分配适当大小的缓冲区并重复实际操作。这是调用者在需要自己分配缓冲区时会做的事情,例如在调用snprintf时。

(你也谈到缓冲的I / O.虽然printf可以使用它,printf不一定知道缓冲区本身(它可能不应该)。你可以想到它多次调用fputc,然后将char写入某个缓冲区,如果它已满,则将其刷新。)

答案 2 :(得分:0)

  

但实现如何知道定义char数组的大小   保持结果

只读取空终止字节'\0'。无需明确了解"%s%d%c"

传入的char *的大小