C语言可变参数如何传递给另一个接受可变参数的函数?

比如说,有一个log_printf的函数定义如下:

void log_printf(char *fmt, ...);

参数fmt和后面的变参,调用规则和printf相同。该函数使用sprintf,将fmt和之后的参数转换成格式化字符串,再使用fwrite写入到文件,或使用OutputDebugStirng输出调试信息。

那么,如何在该函数内部将fmt和后面的变参传递给sprintf?C语言能否实现这一操作?还是必须使用内嵌汇编?

0

2个回答

用vsnprintf()函数即可

0

这是网上找的代码 你可以参考一下
#include
#include
int mon_log(char* format, ...)
{
char str_tmp[50];
int i=0;
va_list vArgList; //定义一个va_list型的变量,这个变量是指向参数的指针.
va_start (vArgList, format); //用va_start宏初始化变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
i=_vsnprintf(str_tmp, 50, format, vArgList); //注意,不要漏掉前面的_
va_end(vArgList); //用va_end宏结束可变参数的获取
return i; //返回参数的字符个数中间有逗号间隔
}
//调用上面的函数
void main() 
{
int i=mon_log("%s,%d,%d,%d","asd",2,3,4);
printf("%d\n",i);
}

1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何在一个可变参数函数中调用另一个可变参数函数
之前看到论坛上有人问,如何在一个可变参数函数中调用另一个可变参数函数 ,其实一句话就可以搞定:#define debug_printf(fmt, ...) printf( fmt, ##__VA_ARGS__)
C语言之传递可变参数
C语言之传递可变参数文章链接:知识点 传递int可变参数个数; 传递char类型可变参数个数; 传递logn类型可变参数个数; 传递可变参数个数特例; 新名词记录{stdarg.h, va_list, va _start(), va _arg(), va _end()} 概述在一个状态下,我们可能我们需要传递的参数的个数是可变的。C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体
C语言函数调用之可变参数列表
在C语言中,函数调用可以传参,也可以不传参,可以传一个参数,也可以传多个参数。今天我们来聊聊有关C语言中的可变参数列表。 先来看一段代码: #include<stdio.h> #include<stdlib.h> #include<stdarg.h> int Max(int n, ...) { va_list arg; int i...
【C语言】如何写一个参数可变的函数
在C语言开发中,有时候需要写一个参数可变的函数,类似于print打印函数一样,可以接收多个任意参数。那么,我们应该怎样写呢?答案是:使用stdarg.h头文件。
c++ 中怎么传递可变参数
可变参数不能直接传递,可以借用 va_list void Log(const char * szFormat, ...); const QString GetFormatStr(const char * szFormat, va_list args ); void TVLogger::Log(const char * szFormat, ...) { va
C语言可变参数使用介绍
我们可能常常在linux c中看见一些函数,特别是输出函数,或可以格式转化的函数,比如printf等函数,他的参数是可变的。 int printf(const char *format, ...); int vprintf(const char *format, va_list ap); int vfprintf(FILE *stream, const char...
可变参数函数的基本原理及使用实现
软件开发过程中,我们最常见的可变参数函数是自定义的日志打印函数,用于程序的调试以及生产维护问题查找的基本依据。这里对该函数做简要的介绍以及基本使用方法。 作为初学者以下内容不可避免会借鉴其他博主的内容,在此表示感谢。
c语言接收可变参数
也许某些时候, 你遇到这种情况,希望设计一个函数,可以接受的参数个数是变化的,就是说它的参数个数,不是预先定义好的, C语言提供了一种方案可以实现一个函数,接受可变参数。下面例子,展现一个这样的例子:int fun(int, ...){ } int main() { func(1, 2, 3); func(1, 2, 3, 4); }注意,func 最后一个参数是省略号,就是 (...)...
Golang中接受可变个数参数的函数(Variadic function)
一个例子:func sum(vals ...int) int { // 在函数内部 vals 作为slice []int的存在而使用 total := 0 for _, val := range vals { total += val } return total }使用:sum() sum(3) sum(1, 2, 3)另一个例子:func
C 可变参数函数的实现方法
基本原理 在C中,函数形参从右往左入栈,且栈是从高地址往低地址方向增长。通过利用指针,可以访问未出现在列表中的参数。 实现步骤 相关宏定义如下: //define in stdarg.h #define va_start __crt_va_start #define va_arg __crt_va_arg #define va_end __crt_va_end //define...
C++中传递可变参数
std::string & getFormattedStr(std::string &strFormatted, const char *strFormat, va_list arglist) { const int MAX_FORMATTED_STR_LEN = 2048; char strResult[MAX_FORMATTED_STR_LEN] = { 0 }; vsp...
变参函数调用变参函数小结
简单总结一下 变参函数调用变参函数(备忘)   一、调用函数的格式为:fun(*, va_list )    //“*”表示可能有一个或多个参数,这里旨在介绍最后一个参数是va_list类型的情况 以printf()的实现为例,下面是printf()函数的源码: int printf(const char *fmt, ...) { char printf_buf[
封装printf sprintf fprintf等可变参数函数
点击打开链接 写一个函数封装printf void my_printf(const char *format,...) { va_list args; va_start(args,format); vprintf(format,args); //必须用vprintf va_end(args); }
如何自定义可变参数函数
在我们编写代码中,有时需要我们自定义可变参数函数,像库函数中有pirntf,ioctl都是可变参数函数,如果我们要实现自定义可变参数,一般要实现像int ioctl(int fd, unsigned long request, ...)这种功能的。下面讲解如何实现ioctl这个类型函数 1.通过分析printf函数: 1)typedef char *va_list;   2)#define...
C语言可变参数函数实现printf功能
最近在学习S3C2440这款ARM芯片,在学习到串口时,需要通过串口向pc机打印串口信息。以前在学习51和stm32时都是通过操作寄存器实现一个putchar()函数,然后向pc机发送信息,用起来很是不大方便。所以去了解了一下printf()函数的实现方法。现将其总结下来与大家分享。在头文件#include <stdarg.h>中有一组宏定义 ,用于获取不确定参数的个数。#define...
JavaScript如何处理可变参数
可变参数是很有用处的,例如c++的printf,sprintf,没这玩意,你想灵活的处理字符串是一件很难的事情。 不同于C++可变参数的函数,JavaScriptt的可变参数函数不需要声明任何形参,我对JavaScript不熟,也不知道这样说符不符合这门语言的规范,以C++做类比,只是想容易理解一些。 还是直接来个例子吧 function TestAgr(){ console.log
C语言“参数数量可变的函数”
//STM32平台 #include <stdarg.h> void test(int, ...); void test(int num_args, ...) { double V1,V2,V3,V4; va_list ap; va_start(ap, num_args); V1 = num_args;//va_arg(ap, int); V2 = va_arg(
C语言中可变参数的使用方法
写在前面 其实,可变参数这个东东自从入门C语言开始就一直在使用,最经典的就是printf打印输出。不论是从事嵌入式开发,还是搞Android的NDK开发,经常会用到可变参数输出log,但是很多时候是用别人封装好的API,而忽略了事情的本质。 需求 平时我们写C语言函数时,一般是固定参数的,但是像打印输出格式化内容时,其参数个数就不确定了,类似如下: printf(&quot;This is ...
c语言可变参数原理以及printf函数的自实现
可变参数原理
C语言可变参数和格式化输出
可变参数我们知道在C++中可以通过函数重载的方式为函数提供接受可变个参数的功能,而在C语言中并没有重载的机制,不过C语言仍然提供了在头文件< stdarg.h >中提供了类似的功能。 在头文件中提供了va_list类型来存放可变参数列表(这个类型应该是一个指针),以及三个宏来实现相关的操作,三个宏的原型如下:void va_start(va_list ap, last_arg) //这个宏初始化
C语言可变参数函数取参方法
熟悉C的人都知道,C语言支持可变参数函数(Variable Argument Functions),即参数的个数可以是不定个,在函数定义的时候用(...)表示,比如我们常用的printf()\execl函数等;printf函数的原型如下: int printf(const char *format, ...); 注意,采用这种形式定义的可变参数函数,至少需要
va_list(可变参数函数的使用)
A_LIST 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。va_list 用法示例:#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdarg.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; i...
C语言可变参数的实现
x86函数调用惯例 在开始说明可变参数的实现之前,我们要说说x86函数调用的一些惯例。函数参数传递是从右向左的入栈顺序,在x86体系中,用户栈是从用户地址空间的顶端开始向下拓展的。 va_list 可变参数由类型 va_list,一组宏va_start,va_arg,va_end实现。宏的实现根据编译器而有所不同。 下面以VC6.0为例说明va_list的实现。 假设一个函数调用fo...
C语言可变参数宏定义方法
在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如:  1 2 #define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg) 用可变参数宏(variadic macros)传递可变参数表  你可能很熟悉在函数中使用可变参
C语言关于可变参数,结构体的深度剖析
1 关于可变参数中的va_start(ap,v), va_arg(ap,t), va_end(ap)三个函数解析。    va_start(ap,v)等价于 char *p = (char *)&amp;amp;format;   i=va_arg(ap,int)等价于i = *((int *)p),p = p + sizeof(int).分两个步骤完成取值,指针移动。va_end(ap)等价于p = (...
C语言函数可变参数处理简介
在c语言编程中,有时会遇到函数可变参数的情况,c语言没有像C++那样具有函数重载的机制,不过c语言还是考虑到了这方面的问题,设计了几条语句来处理这种情况。       下面就以实例来说明这个语句的使用,部分说明就包含在程序中了吧。       1、求取一个可变数组的均值// ConsoleApplication8.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h"
C语言可变参数列表知识总结
-
揭密X86架构C可变参数函数实现原理
前两天公司论坛有同事在问C语言可变参数函数中的va_start,va_arg 和 va_end 这些接口怎么实现的?我毫不犹豫翻开箱底,将多年前前(算算有十年了)写的文章「亲密接触C可变参数函数」发给他,然后开始了深入的技术交流,才有现在这篇文章,所以这篇文算是写给同事的,也分享给大家。 「亲密接触C可变参数函数」这篇文章讲的是i386架构下可变参数函数的实现原理,但是从i386到X86架构,两...
linux下可变参数及宏定义封装函数
以下函数包含内容:a 使用宏封装可变参函数 b 可变参数。比较简单,无注释。   两个函数均可以打印出调用者的文件、函数、行号信息。需要参考该代码的,拿走不谢!   #include  #include  #include      #define BUF_LEN 500   /* 封装调试函数 */ #define macroFunc(info)  (transparen
sprintf 可变参数
sprintf函数定义如下: int sprintf (char * szBuffer, const char * szFormat, ...) ; 第一个参数是字符缓冲区;后面是一个格式字符串。Sprintf不是将格式化结果标准 输出,而是将其存入szBuffer。该函数返回该字符串的长度。在文字模式程序设计 中, printf ("The sum of %i and %i is %i
c里面可变参数实现日志系统的大概思路
#include #include #define LOG(format, p) f(format, p, __FILE__, __LINE__) void f(char* p,...) { char buf[256] = {0}; //memset(buf, 1, 256); va_list list; va_start(list, p); vsp
C语言中实现参数个数可变函数
其实,我总觉得有个结论应该是必然的。既然很多语言最初都是由C语言发展来的,还有很多语言的基础是用C语言实现的。那么,这些用C语言实现的高级语言的很多特性或者是功能在一定程度上应该是在C语言的开发中可以模拟的。正是如此,很多时候考虑诸如XXX是否可以用C语言实现的时候,应该无需考虑就能够给出一个肯定的答复。        关于参数可变的函数的实现其实还不是这种情况,但是让我想到的是“是否能够实现参
关于C语言可变参数函数的写法及其应用
以前一直以为C语言的函数都是精确匹配的,直到看了 C和C指针 才知道还有可变参数的函数。仔细一想,平时最常用的printf ,scanf 不就是可变参数的吗。 先上代码,随后详细讲解可变参数函数的用法。 #include&amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;lt;stdarg.h&amp;amp;amp;amp;gt; void fun(int num, ...) { int i;
C语言实现printf函数,即参数可变函数原理
我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()  这个函数,它的定义是这样的:  int printf( const char* format, ...);  它除了有一个参数format固定以外,后面跟的参数的个数和类型是  可变的,例如我们可以有以下不同的调用方法:  printf("%d",i);  printf("%s",s);  printf("the
C语言可变参数
null C语言可变参数 C语言可变参数 C语言可变参数
java 可变参数传值
到J2SE 1.4为止,一直无法在Java程序里定义实参个数可变的方法——因为Java要求实参(Arguments)和形参(Parameters)的数量和类型都必须逐一匹配,而形参的数目是在定义方法时就已经固定下来了。尽管可以通过重载机制,为同一个方法提供带有不同数量的形参的版本,但是这仍然不能达到让实参数量任意变化的目的。 然而,有些方法的语义要求它们必须能接受个数可变的实参——例如著名的
如何确定特定情况下可变参数函数的参数个数
1.心血来潮,想了解一下可变参数函数 这是vadefs.h函数中相关的定义     #define __crt_va_start_a(ap, v) ((void)(ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)))     #define __crt_va_arg(ap, t)     (*(t*)((ap += _INTSIZEOF(t)) -
js函数可变参数
js函数可变参数
C语言·可变参数列表
可变参数列表浅析
C中可变参数函数及log函数运用
C语言中函数可以定义为可变参数的。看printf的定义: int printf(char *fmt, ...); 可变参数的处理需要用到stdarg.h中的一些宏。 C语言标准库中头文件stdarg.h包含了一组能够遍历变长参数列表的宏。主要包含下面几个: 1、va_list 用来声明一个表示参数表中各个参数的变量。 2、va_start 初始
文章热词 统计学稳健估计opencv函数 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 产品经理最想接受的培训 大数据培训传智