如果没有明确提到参数计数,printf()如何工作

时间:2016-07-10 10:39:17

标签: c printf

在具有可变数量的参数的函数中,"第一个参数" "参数总数"被通过。但在printf()中,我们从未提及参数计数。那么它如何了解总参数列表呢? printf()如何运作?

3 个答案:

答案 0 :(得分:3)

您没有向printf提供参数计数 - 但您确实提供了格式字符串 - 而且它指定了printf应该预期的参数数量。

非常粗略地说,格式字符串中%个符号的数量是参数计数(尽管现实有点复杂)。

答案 1 :(得分:3)

让我们看看printf声明结构:

int printf(const char *format, ...)

format实际上是包含要写入stdout的文本的字符串。

包含的嵌入格式标记稍后将被后续附加参数中指定的值替换,并根据需要相应地设置格式。

答案 2 :(得分:1)

格式字符串中的转换说明符告诉printf它应该期望的参数的数量和类型 - 例如,格式字符串"there are %d vowels in %s\n"告诉printf除格式字符串外,还需要两个参数,第一个是int类型,第二个是char *

由您来确保参数与格式字符串匹配。如果没有传递足够的参数,或者参数类型与格式字符串所期望的不匹配,那么行为是 undefined (很可能是乱码输出或运行时错误)。如果传递太多参数,则会计算其他参数,但只要满足格式字符串,函数就会正常运行。

修改

Chapter and verse

7.21.6.1 fprintf功能
...
2 fprintf函数在stream指向的字符串的控制下将输出写入format指向的流,该字符串指定后续参数如何转换为输出。如果格式的参数不足,则行为未定义。如果参数保留时格式已用尽,则会评估多余的参数(一如既往),否则将被忽略。当遇到格式字符串的末尾时,fprintf函数返回。