前言:
看到sprintf,swprintf之類的可變參數格式化函數,是否想過我們能寫一個自定義的類似的函數嗎?答案是很定的,下面來介紹一種方法,用va_list,va_start, va_end來實現。
va_list是一個宏,使用的時候先定義一個變量,然后用va_start來初始化,使用完后用va_end來結束。使用時我們可以分析每一個參數,這時要使用va_argc,但是沒有方法知道有多少個參數。所以可以簡單的將參數格式化輸出到一個緩沖區里,需要使用函數vsprintf。
舉一個簡單的小例子:
#include "stdafx.h" #include <Windows.h> void varPrint(char *format, ...) { va_list va; //定義變量 va_start(va, format); //初始化變量 char szMsg[0x30] = { 0 }; //簡單的將消息輸出到緩沖區里,返返回的是緩沖區的字符個數,不包括'\0' int nCount = vsnprintf_s(szMsg, sizeof(szMsg), sizeof(szMsg)-sizeof(char), format, va); int argc1 = va_arg(va, int);//第一個參數為va_list變量,第二個參數為要返回的數據類型 int argc2 = va_arg(va, int);//。。。。。。。。 int argc3 = va_arg(va, int); va_end(va);//最后釋放資源 printf_s("result:%s", szMsg); } int _tmain(int argc, _TCHAR* argv[]) { SYSTEMTIME sysTime = { 0 }; CHAR szMsg[512] = { 0 }; GetLocalTime(&sysTime); //這里的格式化信息將在調用中輸出 varPrint("Msg:%d-%d-%d %d", sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wDayOfWeek); getchar(); return 0; }