我一直在检讨从多个来源,包括我最喜欢的老K&R第二版的东西。
我一直在寻找的可变参数的功能,几乎所有我见过的使用和int
省略号前的辅导,以确定传递的总人数可变的参数。
但K&R书中不使用int
例如,他们使用char *
我搜索计算器,发现这样的东西:
任何可变参数函数必须有来电的方式指定的参数的数量和类型。的* printf的功能,例如,通过(非可变参数)格式字符串这样做。 link
和
否 - C没有定义到底具有可变参数的任何特殊含义。当你写一个函数,变量参数列表,它是由你来决定如何告诉它如何名单的长已经过去了。 link
K&R minprintf旨在展示如何使用可变参数函数。
----展示如何编写流程可移植的方式可变长度参数列表的功能。由于我们主要感兴趣的参数处理,minprintf将处理格式字符串和参数,但会调用真正的printf做格式转换
K&R只显示功能,我添加的主要底部,看看它是否会工作。我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, %s\n", i, j, str);
}
minprintf
如何知道何时才能结束?有没有在那里NULL
? K&R不解释它。从东西我读上线,以及一些引号以上,一个可变参数功能,不知道到哪里结束,除非你告诉它,如用省略号前一个int。
是的,有在那里\0
。看看循环的终止条件:
for (p = fmt; *p; p++) { // look here
// ...
}
当p
不指向一个\0
值,*p != '\0'
,即(bool)*p
是true
。在这种情况下,*p
被处理,无论是%
,还是其他什么东西。
当p
指向\0
值,(bool)*p
是false
。循环结束,而va_end
被调用。
因此,在已经扫描过的字符串后,处理的所有%
说明符,它终止通过检查字符串的结尾。