c语言变参函数
❶ sprintf()函数的用法
sprintf 是个变参函数,定义如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串上。
printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终
函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。
sprintf的第一个参数是目的字符串
sprintf指的是字符串格式化命令,函数声明为 int sprintf(char *string, char *format [,argument,...]);,主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。
使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。解决这个问题,可以考虑使用snprintf函数,该函数可对写入字符数做出限制。
❷ c语言可变参数是干什么的
可变参数是用于调用函数时,不知道参数的个数及类型的一种场合,最经典最常用的是
int
printf(const
char
*format[,
argument,
...]);
它后面的参数类型及数量都是可变的
如
printf("%d",x);
//一个int参数
printf("%d%d%s\n",x,y,z);
//三个参数,前两个为int,后面的为char
*
❸ 急!!!高手请进, 请教c语言的可变参数函数, 如何求字符串长度
要求出传入参数的总长度容易,代码附下(只做了%s%d%c的支持,其他可以自己做)。
但你申请了buf后,还要把这些变量拷到str中,需要考虑统计的时候把每个变量的长度和指针保存下来,申请buf空间后,直接即可,省得再取一次变量。这一块没有替你考虑。
while (*fmt) {
if (*fmt++ != '%') {
nsize++;
continue;
}
switch (*fmt++) {
case 'd':
i = va_arg(marker, int);
do {
nsize++;
} while (i/=10);
break;
case 'c':
c = (char)va_arg(marker, int);
nsize++;
break;
case 's':
s = va_arg(marker, char *);
nsize += strlen(s);
break;
default:
printf("in default\n");
break;
}
}
❹ C语言变参函数Printf实现机制是什么
像printf()/scanf()这样参数数量可变的函数称为variadic函数,请自行在网上查找相关资料吧.
❺ c语言中什么是可变参数最好有简单的应用可变参数的例子。谢谢
一般在传递实参的时候,可以是常量类型、或者地址指针的方式,如果以地址的方式传参的话,参数的数量就是可以任意变的,而数组也是地址,比如你在传一个数组的时候,就需要另一个整形参数来记录这次数组中含有几个有效参数。
❻ C语言可变参数传递的问题
方案是有的,但是需要用到汇编代码。而且,不同的CPU架构,代码写起来还不一样。
大概的方法,通过解析fmt的内容,找出其中的%d、%u等格式控制符,根据格式控制符,提取出后面的各个参数。参数如何提取,需要用到汇编代码,而且不同的CPU架构,代码实现是有差异的。
不过,在下觉得,您可能并不需要真正实现这样的函数。或许将fun1定义为类似如下的一个宏,就能解决你的问题了吧。
#define fun1(a,b,fmt, args...) \
do \
{ \
if (a>b) \
{ \
fun2(fmt, ##args); \
} \
else \
{ \
fun2(fmt, ##args); \
} \
} while (0)