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算法
- 紅包金額分配