C++可变参数函数 stdarg.h && vsprintf
C++可变参数函数 stdarg.h
stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函数能够接收可变参数。
stdarg.h数据类型(C89)
va_list: 用来保存宏va_arg与宏va_end所需信息
stdarg.h的宏(C89)
va_start: 使va_list指向起始的参数
va_arg: 检索参数
va_end: 释放va_list
va_copy: 拷贝va_list的内容
示范例子
程序
#include <stdio.h> #include <stdarg.h> void printargs(int arg1, ...) /* 输出所有int类型的参数,直到-1结束 */ { va_list ap; int i; va_start(ap, arg1); for (i = arg1; i != -1; i = va_arg(ap, int)) printf("%d ", i); va_end(ap); putchar('\n'); } int main(void) { printargs(5, 2, 14, 84, 97, 15, 24, 48, -1); printargs(84, 51, -1); printargs(-1); printargs(1, -1); return 0; }
输出结果:
5 2 14 84 97 15 24 48 84 51 1
end one
vsprintf
vsprintf() 中的 arg 参数位于数组中。数组的元素会被插入主字符串的百分比 (%) 符号处。该函数是逐步执行的。在第一个 % 符号中,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。
/* 函数名: vsprintf 功 能: 送格式化输出到串中 返回值: 正常情况下返回生成字串的长度(除去\0),错误情况返回负值 用 法: int vsprintf(char *string, char *format, va_list param); // 将param 按格式format写入字符串string中 注: 该函数会出现内存溢出情况,建议使用vsnprintf 程序例: */
stdarg.h && vsprintf 的配合使用
#include <stdarg.h> #include<stdio.h> char buffer[80]; int vspf(char *fmt, ...) { va_list argptr; int cnt; va_start(argptr, fmt); cnt = vsprintf(buffer, fmt, argptr); va_end(argptr); return(cnt); } int main(void) { int inumber = 30; float fnumber = 90.0; char string[4] = "abc"; vspf("%d %f %s", inumber, fnumber, string); printf("%s\n", buffer); return 0; }
该程序结果为
30 90.000000 abc
summary:
VA_LIST的用法( VA_LIST 是在C语言中解决变参问题的一组宏): (1)首先在函数里定义一个VA_LIST型的变量,这个变量是指向参数的指针 (2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个 参数是第一个可变参数的前一个参数,是一个固定的参数。(如在运行VA_START (ap,v)以后,ap指向第一个可变参数在堆栈的地址。) (3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。 (4)最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。 如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。
 
                    
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号