c语言中的变参问题

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");
}     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值