2012-07-08 65 views
0
printf("%s%d%c", s, a, c); 

串将在标准输出被打印;但是实现知道如何定义char数组的大小来保存结果呢?C如何知道printf的输出字符串大小?

或者,另一种方法是:使用固定大小的缓冲器,处理每个变量参数格式字符串后面,如果解释字符串大小超过缓冲区的大小,然后将其输出到输出流。这是真的?我想,C++中的字符串类型,其实现使用堆内存,动态内存分配器,就像newdelete,这是正确的吗?

+4

有很多开源实现各地。为什么不去看一个呢? – 2012-07-08 17:06:29

+5

你为什么认为必须有一个“char数组来保存结果”? – 2012-07-08 17:07:05

+1

也许没有,和printf只是陆续写一个字节diectly文件描述符1 ... – 2012-07-08 17:08:43

回答

4

的字符串将在标准输出

这是正确的打印。这是一个,不需要char []。只有sprintf()需要猜测字符串缓冲区大小。

+4

由于'sprintf'没有考虑到缓冲区本身,所以最后一句话*有点误导。 *调用者*需要知道缓冲区有多大。当然他们从来不会这样做,他们只是使用固定大小的缓冲区。 :p – 2012-07-08 17:11:22

+0

感谢您的回答。所以我是正确的关于c + +字符串的实现,该字符串被实现为堆分配内存通过新/删除? – bluesea 2012-07-08 17:14:07

+0

std :: string类是一个库实现细节,每个编译器都有自己的库。矿井不会开始使用堆,直到字符串变得足够大。否则这与printf()无关,也许你应该询问另一个关于它的问题。 – 2012-07-08 17:33:34

0

但执行是如何知道界定持有什么尺寸的字符数组 结果

只是读取多达空终止字节'\0'。没有必要明确地知道这是传过来的char *

1

正如其他人所解释的​​的大小,printf并不需要知道一些输出缓冲区的大小提前时间,因为它并不需要在写入FILE*流时分配一个。

但是,你可能会怀疑:那么printf中的函数不会写入FILE*流呢?比如说,返回分配字符串的非标准asprintf函数呢?

printf家庭的功能可以做干运行底层的实现。也就是说,它可以模拟做的操作,而不实际写入内存和跟踪,这将有书面char S上的号码。一旦计算出该数字,它就可以分配一个合适大小的缓冲区并重复实际操作。这是调用者在需要自行分配缓冲区时会执行的操作,例如当调用snprintf时。

(你也谈过缓冲I/O,虽然printf可以使用,但printf不一定知道缓冲本身(它可能不应该)),你可以认为它调用fputc一堆次,然后写入char到一定的缓冲,冲洗它,如果它的全部。)