VARL
VAR_LIST是C语言中解决变参问题的一组宏,在
用法:
- 定义va_list型变量,该变量是指向参数的指针
- 用va_start宏初始化刚定义的var_list变量, 这个宏的第二参数是第一个可变参数的前一个参数,是一个固定的参数
- 用va_arg返回可变的参数,va_arg的第二个参数是你要返回的参数的类型
- 用va_end宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。如果函数有多个可变参数的,依次调用va_arg获取各个参数
vsnprintf(), vfprintf()函数
1. vsnprintf()
- 在头文件
<stdarg.h>
中定义 - 函数原型: int vsnprintf(char *str, size_t size, const char *fmt, va_list ap);
- 功能: 将可变参数格式化输出到一个字符数组
- 参数: 输出到的数组str, 指定的大小size(防止越界), 格式化参数fmt, 可变参数列表ap
2.snprintf()
- 函数原型: int snprintf(char*str, size_t size,constchar*format, …);
- 功能: 最多从源串中拷贝size-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为size的话,将不会溢出
- 返回值: 若成功则返回欲写入的字符串长度,若出错则返回负值
3. vfprintf()函数
- 函数原型: int vfprintf(FILE *stream, const char *format, va_list arg);
- 函数说明:fprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束(‘\0’)为止
#include <errno.h>
#include <limits.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINE 1024
static void err_doit(int errnoflag, int error, const char *fmt, va_list ap) {
char buf[MAXLINE];
vsnprintf(buf, MAXLINE-1, fmt, ap);
if (errnoflag)
snprintf(buf+strlen(buf), MAXLINE-strlen(buf)-1, ": %s",
strerror(error));
strcat(buf, "\n");
fflush(stdout);
fputs(buf, stderr);
fflush(NULL);
}
void err_sys(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
err_doit(1, errno, fmt, ap);
va_end(ap);
exit(1);
}
int main() {
err_sys("syscof error");
}