前言:
看到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; }
原文地址:https://www.cnblogs.com/priarieNew/p/9756353.html
时间: 2024-10-06 07:11:43