va_start(),va_end(),vsnprintf()函数
2016-11-04 13:56
309 查看
va_start()va_end()函数的应用:
1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表
2:函数参数的传递原理
函数参数是以数据结构:栈的形式存取,从右至左入栈.
eg:
3:获取省略号指定的参数
在函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。
4.va_start使argp指向第一个可选参数。va_arg返回参数列表中的当前参数并使argp指向参数列表中的下一个参数。va_end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。
实例:
编译运行:
[root@fly test]# gcc -o vstart vstart.c
[root@fly test]# ./vstart
Parameter #0 is: This
Parameter #1 is: is
Parameter #2 is: a
Parameter #3 is: demo!
[root@fly test]#
注意:va_arg()的格式:
type va_arg(va_list ap, type);
因此:
int d;
char c, *s;
d = va_arg(ap, int); /* int */
c = (char) va_arg(ap, int); /* char */
s = va_arg(ap, char ); / string */
实例2:
编译运行:
[root@fly test]# gcc -o start start.c
[root@fly test]# ./start
string ast
int 224
char x
[root@fly test]#
注意foo()格式:
foo(“%s,%d,%c/n”,a,b,c);
// crt_vsnprintf.cpp
1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表
void foo(...); void foo(parm_list,...);
2:函数参数的传递原理
函数参数是以数据结构:栈的形式存取,从右至左入栈.
eg:
#include void fun(int a, ...) { int *temp = &a; temp++; for (int i = 0; i < a; ++i) { cout << *temp << endl; temp++; } } int main() { int a = 1; int b = 2; int c = 3; int d = 4; fun(4, a, b, c, d); system("pause"); return 0; } Output: 1 2 3 4
3:获取省略号指定的参数
在函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。
4.va_start使argp指向第一个可选参数。va_arg返回参数列表中的当前参数并使argp指向参数列表中的下一个参数。va_end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。
实例:
#include <stdio.h> #include <strings.h> #include <stdarg.h> int demo(char *fmt, ...); int main() { demo("DEMO", "This", "is", "a", "demo!", ""); return 0; } int demo(char *fmt, ...) { va_list argp; int argno = 0; char *para; va_start(argp, fmt); while (1) { para = va_arg(argp, char *); if (strcmp(para, "") == 0) break; printf("Parameter #%d is: %s/n", argno, para); argno++; } va_end(argp); return 0; } //vstart.c #include <stdio.h> #include <strings.h> #include <stdarg.h> int demo(char *fmt, ...); int main() { demo("DEMO", "This", "is", "a", "demo!", ""); return 0; } int demo(char *fmt, ...) { va_list argp; int argno = 0; char *para; va_start(argp, fmt); while (1) { para = va_arg(argp, char *); if (strcmp(para, "") == 0) break; printf("Parameter #%d is: %s/n", argno, para); argno++; } va_end(argp); return 0; }
编译运行:
[root@fly test]# gcc -o vstart vstart.c
[root@fly test]# ./vstart
Parameter #0 is: This
Parameter #1 is: is
Parameter #2 is: a
Parameter #3 is: demo!
[root@fly test]#
注意:va_arg()的格式:
type va_arg(va_list ap, type);
因此:
int d;
char c, *s;
d = va_arg(ap, int); /* int */
c = (char) va_arg(ap, int); /* char */
s = va_arg(ap, char ); / string */
实例2:
#include <stdio.h> #include <stdarg.h> #include <string.h> int foo(char *fmt, ...); int main() { char *a = "ast"; int b = 224; char c = 'x'; foo("%s,%d,%c/n", a, b, c); return 0; } int foo(char *fmt, ...) { va_list ap; int d; char c, *s; va_start(ap, fmt); while (*fmt) switch (*fmt++) { case 's': /* string */ s = va_arg(ap, char *); printf("string %s/n", s); break; case 'd': /* int */ d = va_arg(ap, int); printf("int %d/n", d); break; case 'c': /* char */ /* need a cast here since va_arg only takes fully promoted types */ c = (char)va_arg(ap, int); printf("char %c/n", c); break; } va_end(ap); return 0; } #include <stdio.h> #include <stdarg.h> #include <string.h> int foo(char *fmt, ...); int main() { char *a = "ast"; int b = 224; char c = 'x'; foo("%s,%d,%c/n", a, b, c); return 0; } int foo(char *fmt, ...) { va_list ap; int d; char c, *s; va_start(ap, fmt); while (*fmt) switch (*fmt++) { case 's': /* string */ s = va_arg(ap, char *); printf("string %s/n", s); break; case 'd': /* int */ d = va_arg(ap, int); printf("int %d/n", d); break; case 'c': /* char */ /* need a cast here since va_arg only takes fully promoted types */ c = (char)va_arg(ap, int); printf("char %c/n", c); break; } va_end(ap); return 0; }
编译运行:
[root@fly test]# gcc -o start start.c
[root@fly test]# ./start
string ast
int 224
char x
[root@fly test]#
注意foo()格式:
foo(“%s,%d,%c/n”,a,b,c);
int vsnprintf ( char *buffer, // 输出参数 size_t count, // 最大可写字符数 const char *format,// 格式字符串 va_list argptr // 参数列表指针 );
// crt_vsnprintf.cpp
#include <stdio.h> #include <wtypes.h> void FormatOutput(LPCSTR formatstring, ...) { int nSize = 0; char buff[10]; memset(buff, 0, sizeof(buff)); va_list args; va_start(args, formatstring); nSize = vsnprintf(buff, sizeof(buff)-1, formatstring, args); // C4996 // Note: vsnprintf is deprecated; consider vsnprintf_s instead printf("nSize: %d, buff: %s/n", nSize, buff); } int main() { FormatOutput("%s %s", "Hi", "there"); FormatOutput("%s %s", "Hi", "there!"); FormatOutput("%s %s", "Hi", "there!!"); } Output nSize : 8, buff : Hi there nSize : 9, buff : Hi there! nSize : -1, buff : Hi there!
相关文章推荐
- va_start() va_end()函数应用
- 用va_start() va_end()函数解决不定参数问题(即,fun(...)实现方法)
- va_start() va_end()函数应用(可边参数的函数)
- va_start() va_end()函数应用
- va_list,va_start,va_end,va_copy,vprintf,vfprintf,vsprintf,vsnprintf
- va_start() va_end()函数应用
- va_start() 和va_end() 函数说明
- va_start() va_end()函数应用
- va_list,va_start,va_end处理不定参数函数调用不定参数函数的问题
- C++的va_start() va_end()函数应用(转)
- 函数可变参数va_list、va_start、va_arg、va_end原理及使用方法
- C++的va_start() va_end()函数应用(转)
- va_start() va_end()函数应用
- 如何获取函数的可变参数(va_list, va_start, va_arg, va_end)
- va_start() va_end()函数应用
- va_start() va_end()函数应用
- va_start() va_end()函数应用
- va_start()va_end()函数应用
- C语言可变参数函数及三个宏va_start、va_arg和va_end的使用
- linux下strftime(),va_start(),va_end()函数的用法