{
va_list arg_ptr;
char *s=NULL;
va_start(arg_ptr, i);
s=va_arg(arg_ptr, char*);
va_end(arg_ptr);
printf("%d %s\n", i, s);
return 0;
}
/* 这个函数用来格式化带参数的字符串*/
int vspf(char *fmt, ...)
{
va_list argptr; //声明一个转换参数的变量
int cnt;
va_start(argptr, fmt); //初始化变量
cnt = vsnprintf(buffer,bufsize ,fmt, argptr);
//将带参数的字符串按照参数列表格式化到buffer中
va_end(argptr); //结束变量列表,和va_start成对使用
return(cnt);
int bar (int, const char *, int, ...);extern inline __attribute__((always_inline)) int
f2 (int y, ...)
{
return bar (y, "", __builtin_va_arg_pack ()); /* { dg-error "invalid use of" } */
}
extern inline __attribute__((always_inline)) int
f3 (int y, ...)
{
return bar (y, "", 5, __builtin_va_arg_pack ());
}
}
int
test (void)
{
int a = f2 (5, "a", 6);
a += f3 (6, "ab", 17LL);
return a;
}
extern int __open_real(const char*, int, ...) __asm__(__USER_LABEL_PREFIX__ "open");
__BIONIC_FORTIFY_INLINE int open(const char* pathname, int flags, ...) { if (__builtin_constant_p(flags)) { if ((flags & O_CREAT) && __builtin_va_arg_pack_len() == 0) { __creat_missing_mode(); // compile time error } } if (__builtin_va_arg_pack_len() > 1) { __creat_too_many_args(); // compile time error } if ((__builtin_va_arg_pack_len() == 0) && !__builtin_constant_p(flags)) { return __open_2(pathname, flags); } return __open_real(pathname, flags, __builtin_va_arg_pack()); }
11.31vprintf(格式化输出数据)
相关函数 printf,vfprintf,vsprintf
表头文件 #include<stdio.h>
#include<stdarg.h>
定义函数 intvprintf(const char *format,va_listap);
函数说明 vprintf()作用和printf()相同,参数format格式也相同。va_list为不定个数的参数列,用法及范例请参考附录C。
返回值 成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。
范例 #include<stdio.h>
#include<stdarg.h>
intmy_printf(const char *format,……)
{
va_list ap;
intretval;
va_start(ap,format);
printf(“my_printf( ):”);
retval = vprintf(format,ap);
va_end(ap);
returnretval;
}
main()
{
inti = 150,j = -100;
doublek = 3.14159;
my_printf(“%d %f %x\n”,j,k,i);
my_printf(“%2d %*d\n”,i,2,i);
}
执行 my_printf() : -1003.14159 96
my_printf() : 150 150