用`FCN(字符*,...)可变参数功能`它是如何知道什么时候结束?

问题描述 投票:0回答:1

我一直在检讨从多个来源,包括我最喜欢的老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。

c printf variadic-functions kernighan-and-ritchie
1个回答
2
投票

是的,有在那里\0。看看循环的终止条件:

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

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

p指向\0值,(bool)*pfalse。循环结束,而va_end被调用。

因此,在已经扫描过的字符串后,处理的所有%说明符,它终止通过检查字符串的结尾。

© www.soinside.com 2019 - 2024. All rights reserved.