c语言解决函数变参数问题 va_list

前言:
看到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

c语言解决函数变参数问题 va_list的相关文章

C语言之函数可变参数

先上一段代码: #include<cstdarg> #include<iostream> #include<string> using namespace std; void error(char* format,...){//至少要有一个参数,后边的...表示参数可变 va_list ap; int d,flag; char c, *s; va_start(ap,*format);//从args参数开始后面都是可变参数,va_start,va_end都为宏 while

C++异常捕获与解决函数多参数返回

捕获异常 double divideNumber(double num1,double num2){ if (num2==0) { throw exception(); } return num1/num2; } try{ cout << divideNumber(1,3) << endl; cout << divideNumber(1,0) << endl; }catch(const exception& exp) { cout <<

C/C++语言参数传递----函数/方法 参数的指针引用传递

int m_value = 1; void func(int *p) { p = &m_value; } int main(int argc, char *argv[]) { int n = 2; int *pn = &n; cout << *pn << endl; func(pn); cout << *pn <<endl; return 0; } 看一下输出结果 22 -------其实上面这些例子,看一百次,我个人觉得,也看不出实际意义

C语言中的可变参数函数 三个点“…”printf( const char* format, ...)

第一篇 C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式: printf("%d",i); printf("%s",s); printf("the number is %d ,string is:%s",

C语言函数可变参数列表

C语言允许使用可变参数列表,我们常用的printf函数即为可变参数函数,C标准库提供了stdarg.h为我们提供了这方面支持:该头文件提供了一些类型和宏来支持可变参数列表,包括类型va_list,宏va_start.va_arg.va_end: 可变函数参数定义方法: #include <stdarg.h> void func(int count,...){ va_list ap; int ix, tmp; va_start(ap, a); for(ix=0;ix < count; ++

c 语言函数可变参数的处理

/************************************************************************* > File Name: va_list.c > Author: zshh0604 > Mail: [email protected] > Created Time: 2014年10月14日 星期二 15时16分09秒 **********************************************************

【C语言】模拟实现printf函数(可变参数)

一.printf函数介绍 printf功能 printf函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息. printf原型 int printf( const char* format , [argument] ... ); //定义在stdio.h中 以上部分来自于高小调博客(一个UI非常好,没有广告,纯绿色的博客,建议大家收藏) 二.利用可变参数列表模拟实现printf 1.分析printf函数 printf("Hello haohaosong!\n"); prin

c语言重载(overriding in C)或函数不定参数个数

google一下 c overiding发现有这样一段英文解释: Because C doesn't require that you pass all parameters to the function if you leave the parameter list blank in the prototype. The compiler should only throw up warnings if the prototype has a non-empty parameter list

C语言学习020:可变参数函数

顾名思义,可变参数函数就是参数数量可变的函数,即函数的参数数量是不确定的,比如方法getnumbertotal()我们即可以传递一个参数,也可以传递5个.6个参数 1 #include <stdio.h> 2 #include <stdarg.h>//实现可变参数需要的头文件 3 4 int getnumbertotal(int args,...){//可变参数要放在普通参数(args)的后面:...表示有很多个参数 5 va_list l;//用来保存传给函数的其他参数 6 va