C语言printf家族函数的成员:
```c
#include <stdio.h>
int printf(const char *format, ...); // 输出到标准输出
int fprintf(FILE *stream, const char *format, ...); // 输出到文件
int sprintf(char *str, const char *format, ...); // 输出到字符串str中
int snprintf(char *str, size_t size, const char *format, ...); // 按size大小输出到字符串str中
```
以下函数功能与上面的一一对应相同,只是在函数调用时,把上面的可变参数(...)对应的一个个变量用va_list调用所替代。
```c
#include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
```
#### 一个例子
```c
static void outputError(Boolean useErr, int err, Boolean flushStdout, const char *format, va_list ap)
{
#define BUF_SIZE 500
char buf[BUF_SIZE], userMsg[BUF_SIZE], errText[BUF_SIZE];
vsnprintf(userMsg, BUF_SIZE, format, ap); // 输出可变参数到userMsg
if (useErr)
snprintf(errText, BUF_SIZE, " [%s %s]",
(err > 0 && err <= MAX_ENAME) ?
ename[err] : "?UNKNOWN?", strerror(err));
else
snprintf(errText, BUF_SIZE, ":"); // 输出BUF_SIZE长度到errText
snprintf(buf, BUF_SIZE, "ERROR%s %s\n", errText, userMsg);
if (flushStdout)
fflush(stdout); /* Flush any pending stdout */
fputs(buf, stderr);
fflush(stderr); /* In case stderr is not line-buffered */
}
```
#### 可变参数
va_end , va_arg, va_list叫宏,不是函数,宏用来编译前重写代码,实际上他们是指令
- va_list 用于保存函数的其他参数
- va_start 可变参数从那个开始
- va_arg 获取一个可变参数
- va_end 销毁va_list
```c
#include <stdio.h>
#include <stdarg.h>
static void show_va_list(char *msg, ...)
{
int number;
va_list argList;
va_start(argList, msg);
number = va_arg(argList, int);
va_end(argList);
printf("第一个数字%i\n", number);
}
int main(int argc, char const *argv[])
{
show_va_list("test", 1, 2);
return 0;
}
```
- php
- 编译安装
- 基本概念
- 垃圾回收机制
- 生命周期
- zval底层实现
- c扩展开发
- gdb调试工具
- 自定义扩展简单demo
- 钩子函数
- 读取php.ini配置
- 数组
- 函数
- 类
- yaf扩展底层源码
- swoole扩展底层源码
- memoryGlobal内存池
- swoole协程使用记录
- 单点登录sso原理
- compser使用
- session实现机制
- c & linux
- gcc
- 指针
- 结构体,联合和位字段
- 宏定义井号说明
- printf家族函数和可变参数
- 共享函数
- 静态库和动态库
- makefile自动化构建
- 信号一
- 信号二
- inotify监控文件事件
- socket编程
- 简介
- UNIX DOMAIN
- Internet DOMAIN
- TCP/IP
- 文件IO多路复用
- 内存管理
- 进程组,会话和控制终端
- daemon守护进程
- 多进程
- 多线程
- 常用进制转换
- go
- 入门知识
- 字节和整数装换
- python
- redis
- 应用场景
- 消息队列
- 热点数据
- 扫码登录
- 订阅发布
- 次数限制
- 抢购超卖
- 持久化机制
- mysql
- 工作流程
- MyISAM和InnoDB区别
- 用户和权限管理
- 执行计划
- sql优化
- 事务和锁
- 慢查询日志
- case...when...then...end用法
- sql
- 参考
- linux
- 内核参数优化
- 防火墙设置
- docker
- docker入门知识
- 算法
- 多维数组合
- DFA算法
- 红包金额分配