您的位置:首页 > 其它

va_start()va_end()和vsnprintf()函数应用

2014-05-01 21:10 141 查看
va_start()va_end()函数应用:

man:

#include <stdarg.h>

void va_start(va_list ap, last);

type va_arg(va_list ap, type);

void va_end(va_list ap);

void va_copy(va_list dest, va_list src);

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结尾。

实例:

编写vstart.c,如下:

view plaincopy to clipboardprint?

//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;

}

//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:(start.c)

view plaincopy to clipboardprint?

#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

// compile with: /W3

#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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: