printf("%s%d%c", s, a, c);
串将在标准输出被打印;但是实现知道如何定义char数组的大小来保存结果呢?C如何知道printf的输出字符串大小?
或者,另一种方法是:使用固定大小的缓冲器,处理每个变量参数格式字符串后面,如果解释字符串大小超过缓冲区的大小,然后将其输出到输出流。这是真的?我想,C++中的字符串类型,其实现使用堆内存,动态内存分配器,就像new
或delete
,这是正确的吗?
printf("%s%d%c", s, a, c);
串将在标准输出被打印;但是实现知道如何定义char数组的大小来保存结果呢?C如何知道printf的输出字符串大小?
或者,另一种方法是:使用固定大小的缓冲器,处理每个变量参数格式字符串后面,如果解释字符串大小超过缓冲区的大小,然后将其输出到输出流。这是真的?我想,C++中的字符串类型,其实现使用堆内存,动态内存分配器,就像new
或delete
,这是正确的吗?
的字符串将在标准输出
这是正确的打印。这是一个流,不需要char []。只有sprintf()需要猜测字符串缓冲区大小。
由于'sprintf'没有考虑到缓冲区本身,所以最后一句话*有点误导。 *调用者*需要知道缓冲区有多大。当然他们从来不会这样做,他们只是使用固定大小的缓冲区。 :p – 2012-07-08 17:11:22
感谢您的回答。所以我是正确的关于c + +字符串的实现,该字符串被实现为堆分配内存通过新/删除? – bluesea 2012-07-08 17:14:07
std :: string类是一个库实现细节,每个编译器都有自己的库。矿井不会开始使用堆,直到字符串变得足够大。否则这与printf()无关,也许你应该询问另一个关于它的问题。 – 2012-07-08 17:33:34
但执行是如何知道界定持有什么尺寸的字符数组 结果
只是读取多达空终止字节'\0'
。没有必要明确地知道这是传过来的char *
正如其他人所解释的的大小,printf
并不需要知道一些输出缓冲区的大小提前时间,因为它并不需要在写入FILE*
流时分配一个。
但是,你可能会怀疑:那么printf
中的函数不会写入FILE*
流呢?比如说,返回分配字符串的非标准asprintf
函数呢?
为printf
家庭的功能可以做干运行底层的实现。也就是说,它可以模拟做的操作,而不实际写入内存和跟踪,这将有书面char
S上的号码。一旦计算出该数字,它就可以分配一个合适大小的缓冲区并重复实际操作。这是调用者在需要自行分配缓冲区时会执行的操作,例如当调用snprintf
时。
(你也谈过缓冲I/O,虽然printf
可以使用,但printf
不一定知道缓冲本身(它可能不应该)),你可以认为它调用fputc
一堆次,然后写入char
到一定的缓冲,冲洗它,如果它的全部。)
有很多开源实现各地。为什么不去看一个呢? – 2012-07-08 17:06:29
你为什么认为必须有一个“char数组来保存结果”? – 2012-07-08 17:07:05
也许没有,和printf只是陆续写一个字节diectly文件描述符1 ... – 2012-07-08 17:08:43