gpt4 book ai didi

C: 如何编写类似 printf 的函数

转载 作者:行者123 更新时间:2023-12-04 10:48:58 27 4
gpt4 key购买 nike

我学会了使用库 stdarg.h 来实现参数数量未知的函数。这是一个简单的函数,如何使用它:

void print(int args,...){
va_list ap;
va_start(ap, args);
int i = 0;
for(i=0; i<args; i++){
printf("%d\n",va_arg(ap, int));
}
va_end(ap);
}

根据上面的代码,我不知道 printf 如何克服两个主要的限制:

1) 固定数量的参数:意思是,在几乎 vardiac 函数中,您需要包含参数数量。但是当我写 printf 时,我不必包括这个数字。我认为在 printf 真正使用参数之前,它已经计算了参数的数量(通过计算第一个字符串中的数字 %)。但同样,我认为这个解决方案有点效率不高。它必须经过三个阶段:计算参数的个数,将这些参数入栈,最后全部放入屏幕。

2) 所有参数必须具有相同类型: 正如您在行中所见:printf("%d\n",va_arg(ap, int)); .因此,列表中的每个参数都必须具有相同的类型。正如我们所知,这不是 printf 中必须的。您可以将 double 与整数或字符串一起打印。如果我们把所有这些都当作一个字符串,那么这一行应该是错误的,因为语法错误:

printf("%d",4); //4 cannot treat by string
printf("%d",'4'); // :)) I think this line is better

请帮我解释一下以上两个问题。

最佳答案

1) 你自己回答了这个问题 - printf 必须解析格式字符串来决定在 va_list 中接受多少参数。

2) 当它解析格式列表时,它将跟踪格式列表中指定的参数类型,并使用适当的类型调用 var_arg

还有 see - 有趣的东西在 vfprintf() 中,这是链接的源代码,尽管可能有一个更具可读性(如果效率较低)version .

编辑:snprintf 有一个可移植的实现 here ,看起来更具可读性(在此处找到 Looking for C source code for snprintf() )

关于C: 如何编写类似 printf 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11921304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com