可变长度参数 char frm,... char frm...
2009-06-12 06:31
405 查看
函数名: vfprintf
功 能: 送格式化输出到一流中
用 法: int vfprintf(FILE *stream, char *format, va_list param);
程序例:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
FILE *fp;
int vfpf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vfprintf(fp, fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char string[4] = "abc";
fp = tmpfile();
if (fp == NULL)
{
perror("tmpfile() call");
exit(1);
}
vfpf("%d %f %s", inumber, fnumber, string);
rewind(fp);
fscanf(fp,"%d %f %s", &inumber, &fnumber, string);
printf("%d %f %s/n", inumber, fnumber, string);
fclose(fp);
return 0;
}
函数名: vfscanf
功 能: 从流中执行格式化输入
用 法: int vfscanf(FILE *stream, char *format, va_list param);
程序例:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
FILE *fp;
int vfsf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vfscanf(fp, fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char string[4] = "abc";
fp = tmpfile();
if (fp == NULL)
{
perror("tmpfile() call");
exit(1);
}
fprintf(fp,"%d %f %s/n",inumber,fnumber,string);
rewind(fp);
vfsf("%d %f %s",&inumber,&fnumber,string);
printf("%d %f %s/n",inumber,fnumber,string);
fclose(fp);
return 0;
}
函数名: vprintf
功 能: 送格式化输出到stdout中
用 法: int vprintf(char *format, va_list param);
程序例:
#include <stdio.h>
#include <stdarg.h>
int vpf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, format);
cnt = vprintf(fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char *string = "abc";
vpf("%d %f %s/n",inumber,fnumber,string);
return 0;
}
函数名: vscanf
功 能: 从stdin中执行格式化输入
用 法: int vscanf(char *format, va_list param);
程序例:
#include <stdio.h>
#include <conio.h>
#include <stdarg.h>
int vscnf(char *fmt, ...)
{
va_list argptr;
int cnt;
printf("Enter an integer, a float, and a string (e.g. i,f,s,)/n");
va_start(argptr, fmt);
cnt = vscanf(fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber;
float fnumber;
char string[80];
vscnf("%d, %f, %s", &inumber, &fnumber, string);
printf("%d %f %s/n", inumber, fnumber, string);
return 0;
}
函数名: vsprintf
功 能: 送格式化输出到串中
用 法: int vsprintf(char *string, char *format, va_list param);
程序例:
#include <stdio.h>
#include <conio.h>
#include <stdarg.h>
char buffer[80];
int vspf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vsprintf(buffer, fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char string[4] = "abc";
vspf("%d %f %s", inumber, fnumber, string);
printf("%s/n", buffer);
return 0;
}
函数名: vsscanf
功 能: 从流中执行格式化输入
用 法: int vsscanf(char *s, char *format, va_list param);
程序例:
#include <stdio.h>
#include <conio.h>
#include <stdarg.h>
char buffer[80] = "30 90.0 abc";
int vssf(char *fmt, ...)
{
va_list argptr;
int cnt;
fflush(stdin);
va_start(argptr, fmt);
cnt = vsscanf(buffer, fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber;
float fnumber;
char string[80];
vssf("%d %f %s", &inumber, &fnumber, string);
printf("%d %f %s/n", inumber, fnumber, string);
return 0;
}
可变长度参数
我们在C语言编程中有时会遇到一些参数个数可变的函数,即函数的入参个数和类型是不确定的,例如printf()函数,其函数原型为:
int printf(char* format, ...);
它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式:
printf("%d",i);
printf("the number is %d ,string is:%s", i, s);
以上这些东西已为大家所熟悉。但是究竟如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现的呢?
2.可变长度参数函数的一个例子
为了说明问题,通过编写一个自定义的可处理可变长度参数的函数minprintf来说明。
printf函数的定义格式为:
int printf(char *fmt, …)
这里,…的含义为参数的类型和个数是不确定的。…声明只能出现在参数列表的尾部。函数返回输出的字符个数。
我们自己定义的函数minprintf声明格式为:
void minprintf(char *fmt, …)
因为这里我们不需要返回输出的字符个数,所以定义返回类型为void。
带有可变长度参数的函数里,即没有参数的类型也没有参数的个数,那么编译器是怎么处理这样的函数的呢?
标准头文件stdarg.h定义了一系列的宏来处理这个可变长度的参数列表。这个头文件的实现会因编译器的不同而各异,但它们的接口却是相同的。
类型va_list: 定义为这样一个数据类型,循环使用且每次指向一个可变的参数;在我们举的例子minprintf函数里指变量ap(argument pointer);
函数va_start: 初始化ap,使ap指向第一个可变的参数;注意,这个函数必须在使用ap前被调用;minprintf必须至少有一个确定的参数,而且,最后一个确定的参数才是va_sart函数的一个入参;
函数va_arg:返回一个可变长度参数的值并使ap指向下一个可变长度参数,该函数使用一个类型名来确定要返回的类型和指针ap需要移动的字节单位;
函数va_end:做一些必要的清理工作,需要在程序结束前调用。
other:
int vprintf(const char *format, va_list arg)
函数vprintf与printf等价,只是用arg替换了变量参数列表,arg由va_start宏初始化,并且va_arg可能会调用它。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wenzuodan/archive/2008/01/31/2075193.aspx
功 能: 送格式化输出到一流中
用 法: int vfprintf(FILE *stream, char *format, va_list param);
程序例:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
FILE *fp;
int vfpf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vfprintf(fp, fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char string[4] = "abc";
fp = tmpfile();
if (fp == NULL)
{
perror("tmpfile() call");
exit(1);
}
vfpf("%d %f %s", inumber, fnumber, string);
rewind(fp);
fscanf(fp,"%d %f %s", &inumber, &fnumber, string);
printf("%d %f %s/n", inumber, fnumber, string);
fclose(fp);
return 0;
}
函数名: vfscanf
功 能: 从流中执行格式化输入
用 法: int vfscanf(FILE *stream, char *format, va_list param);
程序例:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
FILE *fp;
int vfsf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vfscanf(fp, fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char string[4] = "abc";
fp = tmpfile();
if (fp == NULL)
{
perror("tmpfile() call");
exit(1);
}
fprintf(fp,"%d %f %s/n",inumber,fnumber,string);
rewind(fp);
vfsf("%d %f %s",&inumber,&fnumber,string);
printf("%d %f %s/n",inumber,fnumber,string);
fclose(fp);
return 0;
}
函数名: vprintf
功 能: 送格式化输出到stdout中
用 法: int vprintf(char *format, va_list param);
程序例:
#include <stdio.h>
#include <stdarg.h>
int vpf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, format);
cnt = vprintf(fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char *string = "abc";
vpf("%d %f %s/n",inumber,fnumber,string);
return 0;
}
函数名: vscanf
功 能: 从stdin中执行格式化输入
用 法: int vscanf(char *format, va_list param);
程序例:
#include <stdio.h>
#include <conio.h>
#include <stdarg.h>
int vscnf(char *fmt, ...)
{
va_list argptr;
int cnt;
printf("Enter an integer, a float, and a string (e.g. i,f,s,)/n");
va_start(argptr, fmt);
cnt = vscanf(fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber;
float fnumber;
char string[80];
vscnf("%d, %f, %s", &inumber, &fnumber, string);
printf("%d %f %s/n", inumber, fnumber, string);
return 0;
}
函数名: vsprintf
功 能: 送格式化输出到串中
用 法: int vsprintf(char *string, char *format, va_list param);
程序例:
#include <stdio.h>
#include <conio.h>
#include <stdarg.h>
char buffer[80];
int vspf(char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vsprintf(buffer, fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber = 30;
float fnumber = 90.0;
char string[4] = "abc";
vspf("%d %f %s", inumber, fnumber, string);
printf("%s/n", buffer);
return 0;
}
函数名: vsscanf
功 能: 从流中执行格式化输入
用 法: int vsscanf(char *s, char *format, va_list param);
程序例:
#include <stdio.h>
#include <conio.h>
#include <stdarg.h>
char buffer[80] = "30 90.0 abc";
int vssf(char *fmt, ...)
{
va_list argptr;
int cnt;
fflush(stdin);
va_start(argptr, fmt);
cnt = vsscanf(buffer, fmt, argptr);
va_end(argptr);
return(cnt);
}
int main(void)
{
int inumber;
float fnumber;
char string[80];
vssf("%d %f %s", &inumber, &fnumber, string);
printf("%d %f %s/n", inumber, fnumber, string);
return 0;
}
可变长度参数
我们在C语言编程中有时会遇到一些参数个数可变的函数,即函数的入参个数和类型是不确定的,例如printf()函数,其函数原型为:
int printf(char* format, ...);
它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式:
printf("%d",i);
printf("the number is %d ,string is:%s", i, s);
以上这些东西已为大家所熟悉。但是究竟如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现的呢?
2.可变长度参数函数的一个例子
为了说明问题,通过编写一个自定义的可处理可变长度参数的函数minprintf来说明。
printf函数的定义格式为:
int printf(char *fmt, …)
这里,…的含义为参数的类型和个数是不确定的。…声明只能出现在参数列表的尾部。函数返回输出的字符个数。
我们自己定义的函数minprintf声明格式为:
void minprintf(char *fmt, …)
因为这里我们不需要返回输出的字符个数,所以定义返回类型为void。
带有可变长度参数的函数里,即没有参数的类型也没有参数的个数,那么编译器是怎么处理这样的函数的呢?
标准头文件stdarg.h定义了一系列的宏来处理这个可变长度的参数列表。这个头文件的实现会因编译器的不同而各异,但它们的接口却是相同的。
类型va_list: 定义为这样一个数据类型,循环使用且每次指向一个可变的参数;在我们举的例子minprintf函数里指变量ap(argument pointer);
函数va_start: 初始化ap,使ap指向第一个可变的参数;注意,这个函数必须在使用ap前被调用;minprintf必须至少有一个确定的参数,而且,最后一个确定的参数才是va_sart函数的一个入参;
函数va_arg:返回一个可变长度参数的值并使ap指向下一个可变长度参数,该函数使用一个类型名来确定要返回的类型和指针ap需要移动的字节单位;
函数va_end:做一些必要的清理工作,需要在程序结束前调用。
other:
int vprintf(const char *format, va_list arg)
函数vprintf与printf等价,只是用arg替换了变量参数列表,arg由va_start宏初始化,并且va_arg可能会调用它。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wenzuodan/archive/2008/01/31/2075193.aspx
相关文章推荐
- 可变长度参数 char frm,... char frm...
- Javascript可变长度参数列表 - Arguments对象
- Java 可变长度参数
- Scala可变长度参数和:_*使用
- JAVA类型后面跟3个点(可变长度参数列表)
- 可变长度参数用法和限制
- Java高新技术1---增强for循环 ---装箱与拆箱享元设计模式--自己写枚举--可变长度的参数
- 可变长度参数和_*符号
- 【转】Python可变长度的函数参数
- Java语法糖1:可变长度参数以及foreach循环原理
- Java语法糖1:可变长度参数以及foreach循环原理
- [转]java可变长度参数
- 变长度形参---可变参数宏(variadicmacros)传递可变参数表
- 可变长度参数以及foreach循环原理
- GNU C语言的 扩展(二)零长度数组&可变参数宏
- PHP 可变长度参数列表
- 【转】Python可变长度的函数参数
- java中可变长度参数的应用
- Scala可变长度参数
- Java中定义形参长度可变的参数