Chinaunix首页 | 论坛 | 博客
  • 博客访问: 315161
  • 博文数量: 82
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-13 10:58
文章分类

全部博文(82)

文章存档

2018年(2)

2017年(9)

2016年(71)

我的朋友

分类: C/C++

2016-11-13 16:08:38

 va_list ap;是指向...可变参数的一个类型,在可变参数函数中一开始要定义一个该变量,然后使用va_start(ap, fmt)函数就可以将可变参数的第一个参数的地址告诉va_list。接下来每调用一次va_arg(ap, char *)函数就可以得到ap所对应的可变参数的值,然后ap就指向下一个参数,其中va_arg的第二个参数类型一定要和ap的参数类型对应。下边的函数演示了如何获得可变参数的值,但该函数并没有严格地去识别%s之类的类型,而只是通过s之类的字符来判断相应的类型。更多参考“man stdarg”

  1. #include <stdio.h>
  2. #include <stdarg.h>

  3. void foo(char *fmt, ...);

  4. int main(int argc, char * argv[])
  5. {
  6.     foo("[%s]b[%d]e[%c]\n", "123", 4, '5');
  7.     return 0;
  8. }

  9. void foo(char *fmt, ...)
  10. {
  11.    va_list ap;
  12.    int d;
  13.    char c, *s;

  14.    printf("%s", fmt);
  15.    va_start(ap, fmt); /* ap将指向第一个可变参数,fmt参数的作用只是告诉va_start可变参数的第一个参数在fmt参数地址的后边 */
  16.    printf("%s", fmt);
  17.    while (*fmt) {
  18.      switch (*fmt++) {
  19.      case 's': /* string */
  20.          s = va_arg(ap, char *);  /* 得到第一个参数 */
  21.          printf("string %s\n", s);
  22.          break;

  23.      case 'd': /* int */
  24.          d = va_arg(ap, int);
  25.          printf("int %d\n", d);
  26.          break;

  27.      case 'c': /* char */
  28.                 /* need a cast here since va_arg only
  29.          takes fully promoted types */
  30.          c = (char) va_arg(ap, int);
  31.          printf("char %c\n", c);
  32.          break;
  33.      }
  34.     }
  35.     va_end(ap);
  36. }

阅读(1232) | 评论(0) | 转发(0) |
0

上一篇:c/c++编译警告和错误

下一篇:C语言解析dns

给主人留下些什么吧!~~