可变参数编程

可变参数列表是通过宏来实现的,这些宏定义于stdarg.h 头文件中。

这个头文件声明了一个类型va_list 和 三个宏  va_start  、va_arg 和 va_end。

我们可以声明一个类型为va_list 的变量,与这几个宏配合使用,访问参数的值。

1、求平均值

2、求最大值

3、实现一个简化的print 函数

void Print(char *str,...)
{
 va_list list;
 va_start(list,str);
 char ch;
 char *p;
 int m;
 double n;
 while(*str != ‘\0‘)
 {
  if(*str == ‘%‘)
  {
   switch(*(str+1))
   {
   case ‘c‘: ch = va_arg(list,char);
             putchar(ch);
          str += 2;
          break;
      case ‘s‘: p = va_arg(list,char*);
             printf("%s",p);
          str += 2;
          break;
      case ‘d‘: m = va_arg(list,int);
             printf("%d",m);
          str += 2;
          break;
      case ‘f‘: n = va_arg(list,double);
             printf("%f",n);
          str += 2;
          break;
      default : putchar(*str++);
             break;
   }
  }
  else
   putchar(*str++);
 }
}

int main()
{
 char *p = "avc";
 int b = 9;
 double m = 0.9;
 char c = ‘a‘;
 Print("%s,%d,%c,%f\n",p,b,c,m);
}

时间: 2024-10-11 05:36:07

可变参数编程的相关文章

【转载】c语言中的可变参数编程

在c语言中使用变长参数最常见的就是下面两个函数了: int printf(const char *format, ...); int scanf(const char *format, ...); 那他们是怎样实现支持变成参数的呢?在使用变长参数的函数(这里假设是func)实现部分其实用到了stdarg.h里面的多个宏来访问那些不确定的参数,它们分别是: void va_start(va_list ap, last); type va_arg(va_list ap, type); void va

c语言可变参数与宏定义

宏定义 https://www.cnblogs.com/wzd5230/p/10959032.html https://www.cnblogs.com/xyang0917/p/4172493.html https://blog.csdn.net/wukery/article/details/53286348 //...表示可变参数列表 #define LOG(format, args...) fprintf(stdout, format, args) LOG("%s","12

C++ 11可变参数接口设计在模板编程中应用的一点点总结

概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量(或属性,C#中属性和成员变量还是有区别的): 类的成员方法: 从编译器的角度看,我们必须明确指定以上3部分,才算完整地定义了一个类并且编译通过. 所谓的“类弱化”,是指类的设计者在定义类的时候,并没有完整定义一个类,而是把类的其中一部分的定义留给类的使用者. 从传统才c++98看,通过模板类,使用

c#编程基础之函数可变参数

可变参数:int sum (params int[] values)int sum (string name,params int[] values) 注意:params参数必须是形参表中的最后一个参数. 代码如下: using System; using System.Collections.Generic; using System.Text; namespace 函数可变参数学习 { class Program { static void Main(string[] args) { Say

C语言的可变参数

可变参数给编程带来了很大的方便,在享受它带来的方便的同时,很有必要了解一下其实现方式,在了解编程语言的同时,也可以扩展编程的思路. 可变参数需要用到3个宏函数和一个类型,他们都定义在<stdarg.h>中,分别是: va_start(vl) va_arg(vl, type) va_end(vl) 其中vl是va_list类型,type就是对象类型(如int, double或 自定义的struct之类的). va_start函数用来初始化vl va_arg(vl, type)用来取得type类型

编写一个可变参数的C函数——头文件stdarg.h中宏va_start ,va_arg和va_end的应用

我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的:int printf( const char* format, ...);它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法:printf("%d",i);printf("%s",s);printf("the number is %d ,string is:%s", i, s);究竟如何写可变参数的

函数可变参数

VA_LIST的用法:(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针: (2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,使其指向第一个可变参数的地址: (3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数): (4)最后用VA_END宏结束可变参数的获取.使用VA_LIST应该注意的问题: (1.可变参数的类型和个数完全由程序代码控制,它并不能智能地识别不

【转】C++可变参数列表处理宏va_list、va_start、va_end的使用

VA_LIST是在C语言中解决变参问题的一组宏他有这么几个成员: 1)va_list型变量: #ifdef     _M_ALPHA typedef    struct{ char* a0; /*pointertofirsthomedintegerargument*/ int offset; /*byteoffsetofnextparameter*/ }va_list; #else typedef    char* va_list;#endif 2)_INTSIZEOF宏,获取类型占用的空间长度

【Java基础】可变参数

下面是一个简单的小程序: 1 import java.util.Arrays; 2 3 class lesson6 4 { 5 public static void main(String[] args) 6 { 7 int array[]={2,3,1,5,4,6}; 8 System.out.println(Arrays.toString(array)); 9 System.out.println(getSum(array)); 10 //System.out.println(getSum(