繁体   English   中英

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

[英]How does C know the output string size of printf?

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

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

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

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

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

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

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

但是,您可能会想知道:关于printf -family中写入FILE*流的printf呢? 例如,返回分配的字符串的非标准asprintf函数呢?

printf系列功能的基础实现可以进行试运行。 也就是说,它可以模拟执行该操作而无需实际写入内存,并且可以跟踪将要写入的char数。 一旦计算出该数字,它便可以分配适当大小的缓冲区,并重复执行该操作。 当调用者需要自己分配缓冲区时(例如,调用snprintf时),这就是这样做的。

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

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

仅读取到空终止字节'\\0' 无需明确知道以char *形式传递的"%s%d%c"的大小char *

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM