用c语言根据可变参数合成字符串的实现代码
写代码时, 经常需要根据参数值得到一特定的字符串. 每次都调用vsprintf, malloc很烦. 以下是一个
实现了此功能的接口.
复制代码 代码如下:
#include
#include
#include
#include
char *xm_vsprintf_ex(int len, char *fmt, ... );
int main(int argc, char *argv[])
{
char *ptr;
ptr = xm_vsprintf_ex(100, "%s-%s-%s", "lias", "dzq", "lvo");
printf("%s\n", ptr);
free(ptr);
return 0;
}
char *xm_vsprintf_ex(int len, char *fmt, ... )
{
va_list ap;
char *ptr;
ptr = (char *)malloc(len * sizeof(char));
if(ptr == NULL)
{
fprintf(stderr, "malloc failed\n");
return NULL;
}
memset(ptr, 0, len);
va_start(ap, fmt);
vsprintf(ptr, fmt, ap);
va_end(ap);
ptr[len-1] = '\0';
return ptr;
}
用起来还是比较爽的.
时间: 2013-05-25
先看代码 复制代码 代码如下: printf("hello,world!");其参数个数为1个.printf("a=%d,b=%s,c=%c",a,b,c);其参数个数为4个. 如何编写可变参数函数呢?我们首先来看看printf函数原型是如何定义的.在linux下,输入man 3 printf,可以看到prinf函数原型如下: 复制代码 代码如下: SYNOPSIS#include int printf(const char *form
通过stdarg.h头文件为函数提供了定义可变参数列表的能力.声明一个可变参数的函数类似: void f1(int n,...); 其中n表示参数列表个数,而用省略号来表示未知参数列表.stdarg.h中提供了一个va_list类型,用于存放参数.一个大概的使用过程类似: void f1(int n,...) { va_list ap; va_start(ap,n); //初始化参数列表 double first=va_arg(ap,double); //取第一个参数 int second=va
这段代码展示了如何不使用中的va_list.va_start.va_end宏来实现自定义可变参数以及如何改变默认的%d.%f.%s等格式字符. 复制代码 代码如下: #include #include // itoa() and ltoa()#include // strcat() and strlen() // echo("$i, $s, $l, $c",
Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理.注意:可变参数必须位于最后一项.当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数.因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项. 可变参数的特点: 1.只能出现在参数列表的最后: 2....位于变量类型和变量名之间,前后有无空格都可以: 3.调用可变参数的方法时,编译器
复制代码 代码如下: #include #include using namespace std;int get_sum(int, initializer_list);int main(int argc, char *argv[]){ cout << get_sum(2, {1,2,3}) << endl; return 0;} int get_sum(int i,
C语言编程中有时会遇到一些参数个数可变的函数,本文详细讲解了可变参数函数的实现原理,分享给大家 在开始学习C语言的函数的时候,我们就知道函数的参数个数应该是在函数声明的时候就指定的,这一点我们没有任何疑问.但是不知道大家有没有注意到我们的printf()函数,他的函数参数理论上并不是确定的,而是随着匹配字符串中的格式控制符的个数控制的.其实当时也没有注意到这一点,到是最近,偶然间看到了 这本书,这里就详细讲解了这种可变参数函数的实现原理,今天考试间隙就顺带学习了一下,其实就是一
本文实例讲述了java可变参数当做数组处理的方法.分享给大家供大家参考,具体如下: java可变参数当做数组处理 ava1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理. 注意:可变参数必须位于最后一项. 原因:当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数.因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项. 可变参数的特点:
本文实例讲述了Python中函数的参数定义和可变参数用法.分享给大家供大家参考.具体如下: 刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解.其实只要把函数参数定义搞清楚了,就不难理解了. 先说说函数定义,我们都知道,下面的代码定义了一个函数funcA def funcA(): pass 显然,函数funcA没有参数(同时啥也不干:D). 下面这个函数funcB就有两个参数了, def funcB(a,
可变参数即表示参数个数可以变化,可多可少,也表示参数的类型也可以变化,可以是int,double还可以是char*,类,结构体等等.可变参数是实现printf(),sprintf()等函数的关键之处,也可以用可变参数来对任意数量的数据进行求和,求平均值带来方便(不然就用数组或每种写个重载).在C#中有专门的关键字parame,但在C,C++并没有类似的语法,不过幸好提供这方面的处理函数,本文将重点介绍如何使用这些函数. 第一步 可变参数表示用三个点-来表示,查看printf()函数和scanf(
由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,提出了指针参数来解决问题. 如printf()函数,其原型为:int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法: printf( "%d ",i); printf( "%s "