C语言中可变形参简单实例和简单的printf功能的实例。
以下程序主要包括三个主要函数:
- 一个最简单的可变形参函数实例;
- 一个简单的printf功能的实例;
- 一个打印字符串函数(辅助);
其中myPrintf函数,实现了printf的部分简单功能,并没有去实现格式化输出操作(%2d %.2f 等),
因为只是它一个实例而已,目的是更好理解掌握可变参数。
后续有兴趣时,我会继续完善的。
- /*******************************************************************************************************
- * 名 称: main.c
- * 功 能:C语言可变形参 variable arguments,典型案例是printf和scanf
- 实现了一个简单的可变参数函数例子 ShowArgs
- 实现了一个简单printf功能的函数 myPrintf
- * 描 述:可变参数的个数是不确定的
- 可变参数的类型是不确定的
- printf和scanf在实现时,通过前面的%d %f 等获取可变参数的个数和类型
- 可变参数由定义在stdarg.h头文件中的宏:va_list va_start va_arg va_end等组成
- va_list:用于保存参数列表
- va_start(v,l):将参数列表的首地址 l 赋值给 v
- va_arg(v,l):获取参数列表中类型为 l 的参数的值,并将参数列表指针向后移动到下一个参数处
- va_end(v):结束可变参数
- * 作 者:JarvisChu
- * 时 间:2011-7-17 创建
- ********************************************************************************************************/
- #include <stdio.h>
- #include <stdarg.h>
- #include <string.h>
- //在此处选择函数
- //#define SHOW_ARGS
- //#define MY_PRINTF
- #define SHOW_STRING_BY_CHAR
- //一个简单的实例,num代表可变参数的个数,类型全部默认为double型
- void ShowArgs(int num,…){
- int i=0;
- double var;
- va_list ls;
- va_start (ls,num); //获取可变参数列表的首地址,赋值给ls
- printf(“———–%d个可变参数,如下:———-\n”,num);
- while(i<num){
- var = va_arg(ls,double);//返回类型为double的的可变参数值,并使ls指向下一个可变参数
- printf(“参数%d:%f\n”,++i,var);
- }
- va_end(ls); //结束
- printf(“\n”);
- }
- //实现类似printf的部分功能,利用putchar向屏幕输出字符
- void myPrintf(char* str,…){
- int i, len;
- // int num = 0; //num为可变参数个数
- char pre,cur; //前一个字符和当前的字符
- va_list ls;
- va_start(ls,str);
- len = strlen(str); //获取字符串长度
- pre = ‘ ‘; //初始化时,pre为空格(只要不是特殊字符或转义字符就行)
- for(i=0;i<len;i++){
- cur = str[i];
- switch(pre){
- case ‘%’: //前一个字符值是%字符,我们就要考虑%d %f 这种情况了
- switch(cur){
- case ‘d’: //%d,输出整数
- printf(“%d”,va_arg(ls,int));//将可变部分的int类型变量替代%d输出,本来很不想在这里用printf的,
- break; //但是没有想到其他的办法向屏幕输出一个整型,姑且用printf吧
- case ‘f’: //%f,输出float double类型
- printf(“%f”,va_arg(ls,double));
- break;
- case ‘c’: //%c,输出一个字符
- putchar(cur);
- break;
- }
- break;
- default: //前一个字符不是什么特殊字符
- if(cur != ‘%’){ //当前字符不是%
- putchar(cur);
- }
- break;
- }
- pre = cur;
- }
- va_end(ls);
- }
- //辅助函数:将一个字符串,一个字符一个字符的输出
- void ShowStringByChar(char* str){
- int i, len;
- char ch;
- len = strlen(str);
- for(i=0;i<len;i++){
- ch = str[i];
- putchar(ch);
- printf(“\n—-\n”);
- }
- }
- int main()
- {
- #ifdef SHOW_ARGS
- ShowArgs(0);
- ShowArgs(1,1.1);
- ShowArgs(2,1.1,2.2);
- #endif
- #ifdef MY_PRINTF
- myPrintf(“Jarvis”);
- myPrintf(“\n”); //注意\n \t为一个字符,不要理解成了char[0] = ‘\’ ; char[1] = ‘n’;
- myPrintf(“\n”);
- myPrintf(“Jarvis\n”);
- myPrintf(“Jarvis %d\n”,22);
- myPrintf(“Jarvis %d\t%d\n”,22, 1990);
- myPrintf(“Jarvis %d\t%d\t%f\n”,22, 1990,63.2);
- #endif
- #ifdef SHOW_STRING_BY_CHAR
- ShowStringByChar(“123\t456\n789%d”);
- # endif
- return 0;
- }