创建函数利用可变参数列表的形式模拟实现printf的功能

★创建函数利用可变参数列表的形式模拟实现printf的功能。

模拟简单的输入单个字符和字符串时的输出形式

如:输入:%c %c %c %c %c\t%s,'h','e','l','l','o',"welcome to here!"

  输出:h e l l o   welcome to here!

#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>    //需引入stdarg的头文件以便建立可变参数列表


void new_printch(char ch)    //对于单个字符处理的函数
{
putchar(ch);       //这里切记不可使用printf的输出形式,不然就没有编写此函数的必要了
}


void my_printstr(char* str)    //对于字符串的输出,调用单个字符输出函数,并使指针不断后移,直到遇到‘\0’,表示一个完整的字符串
{
while (*str)
{
new_printch(*str++);
}
}


void my_print(char* val, ...)  //char*表示了压栈时指针的偏移量,偏移一个字符指针的大小
{
char* vargpch = NULL;
char vargch = 0;
int  vargint = 0;
char *pval = NULL;
va_list vp;    //va_list,va_start,va_end是可变参数列表的表示形式,注意start后的参数,若写错或写反则指针偏移时必然出错,越界取到不可预知的随机值
va_start(vp, val);
pval = val;
while (*pval)
{
if (*pval == '%')
{
switch (*(++pval))
{
case 'c':    //对于单个字符处理的入口
vargch = va_arg(vp, int);
new_printch(vargch);
break;
case 's':    //对于字符串处理的入口
vargpch = va_arg(vp, char*);
my_printstr(vargpch);
break;
default:
break;
}
pval++;
}
else
{
new_printch(*pval++);
}
}
va_end(vp);
}


int main()
{
my_print("%c %c %c %c %c\t%s\n",'h','e','l','l','o',"welcome to here!");
system("pause");
return 0;
}

wKioL1ZB53iydPufAAAWvrMjHNQ311.png

你可能感兴趣的:(创建函数利用可变参数列表的形式模拟实现printf的功能)