printf("%s%d%c", s, a, c);
该字符串将打印在标准输出上;但是实现如何知道定义 char 数组的大小来保存结果?
或者另一种方法是:使用固定大小的缓冲区,处理格式字符串后面的每个变量参数,如果解释的字符串大小超过缓冲区大小,则将其输出到输出流。这是真的?
顺便说一句,我认为,C++ 中的字符串类型,它的实现使用了堆内存、动态内存分配器,就像new
, 或delete
, 这样对吗?
printf("%s%d%c", s, a, c);
该字符串将打印在标准输出上;但是实现如何知道定义 char 数组的大小来保存结果?
或者另一种方法是:使用固定大小的缓冲区,处理格式字符串后面的每个变量参数,如果解释的字符串大小超过缓冲区大小,则将其输出到输出流。这是真的?
顺便说一句,我认为,C++ 中的字符串类型,它的实现使用了堆内存、动态内存分配器,就像new
, 或delete
, 这样对吗?
该字符串将打印在标准输出上
这是正确的。这是一个流,不需要 char[]。只有 sprintf() 需要猜测字符串缓冲区的大小。
正如其他人所解释的那样,printf
不需要提前知道某些输出缓冲区的大小,因为它不需要在写入FILE*
流时分配一个。
但是,您可能想知道:printf
-family 中不写入FILE*
流的函数呢?asprintf
比如说,返回分配字符串的非标准函数呢?
函数族的底层实现printf
可以进行试运行。也就是说,它可以模拟执行操作而无需实际写入内存并跟踪它将写入的char
s数量。一旦计算出该数字,它就可以分配适当大小的缓冲区并真正重复该操作。这就是调用者在需要自己分配缓冲区时会做的事情,例如在调用.snprintf
(您还谈到了缓冲 I/O。虽然printf
可以使用它,printf
但不一定知道缓冲区本身(它可能不应该)。您可以将其视为调用fputc
了很多次,然后将其char
写入一些缓冲区,如果它已满,则刷新它。)
但是实现如何知道定义 char 数组的大小来保存结果
只读取到 null 终止字节'\0'
。无需明确知道"%s%d%c"
作为传入的char *