带有"fcn(char*,..)"的c变量函数如何知道何时结束



我一直在审查来自多个来源的东西,包括我以前最喜欢的K&R第二版

我一直在研究变元函数,我看过的几乎所有教程都在省略号之前使用和int来确定传递的变量参数总数。

但是K&书中的R示例不使用int,而是使用char *

我搜索了stackoverflow,发现了一些东西,比如:

任何可变函数都必须有一种方法,以便调用方指定参数的数量和类型。例如,*printf函数因此通过(非可变)格式字符串。链路

否--C没有将end定义为对varargs有任何特殊意义。当你编写一个接受变量参数列表的函数时让你决定如何告诉它列表已经通过了多长时间。链路

K&R minprintf旨在展示如何使用变差函数。

----展示如何编写处理可变长度的函数以可移植的方式列出参数列表。由于我们主要对参数处理,minprintf将处理格式字符串和参数,但将调用真正的printf来进行格式转换

K&R只显示了函数,我在底部添加了main,看看它是否有效。我用gcc -Wall test.c编译了它。它在没有任何警告的情况下编译,并按预期工作。代码为:

#include <stdarg.h>
#include <stdio.h>
/* minprintf: minimal printf with variable argument list */
void minprintf(char *fmt, ...)
{
va_list ap; /* points to each unnamed arg in turn */
char *p, *sval;
int ival;
double dval;
va_start(ap, fmt); /* make ap point to 1st unnamed arg */
for (p = fmt; *p; p++) {
if (*p != '%') {
putchar(*p);
continue;
}
switch (*++p) {
case 'd':
ival = va_arg(ap, int);
printf("%d", ival);
break;
case 'f':
dval = va_arg(ap, double);
printf("%f", dval);
break;
case 's':
for (sval = va_arg(ap, char *); *sval; sval++)
putchar(*sval);
break;
default:
putchar(*p);
break;
}
}
va_end(ap); /* clean up when done */
}
// I added this main below to test K&R minprintf function. It compiled no errors and gave right answer.
int main()
{
int i = 25;
int j = 21;
char str[] = "This is a test";
minprintf("%d, %d, %sn", i, j, str);
}   

minprintf如何知道何时结束?里面有NULL吗?K&R没有解释。从我在网上读到的东西和上面的一些引文来看,一个变元函数不知道在哪里结束,除非你告诉它,比如在省略号之前有一个int。

是的,里面有一个。查看环路的终止条件:

for (p = fmt; *p; p++) { // look here
// ...
}

p不指向值时,*p != '',即(bool)*ptrue。在这种情况下,*p被处理,无论它是%还是其他什么。

p指向值时,(bool)*p就是false。循环结束,调用va_end

因此,在扫描完字符串并处理完所有%说明符后,它会通过检查字符串的末尾来终止。

相关内容

  • 没有找到相关文章

最新更新