C语言中可变形参简单实例和简单的printf功能的实例

来源:互联网 发布:仿淘宝商城源码html 编辑:程序博客网 时间:2024/05/20 18:02

以下程序主要包括三个主要函数:

  • 一个最简单的可变形参函数实例;
  • 一个简单的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;}

 

原创粉丝点击