老师的递归写法
#include<iostream>
#include<string.h>
#include<stdarg.h>
#include<stdio.h>
using namespace std;
//解析字符串
void translate(const char* pcmd,va_list& ap)
{
//每递归一次处理一次控制字符
if('\0'==*pcmd)
return ;
if('%'!=*pcmd) //非控制子字符串
{
printf("%c",*pcmd);
translate(++pcmd,ap);
}
else//控制字符
{
//*pcmd=='%'; *(pcmd+1)='d' 'u' 'x' 'f' 'c' 's'
switch(*(pcmd+1))
{
case 'x':case 'o':case 'd':case 'c': //将整型转换成16进制
{
char cmd[3]="%";
int value;
cmd[1]=*(pcmd+1);
value=va_arg(ap,int);
printf(cmd,value);
}
break;
case 's': //字符串
{
char* value=NULL;
value=va_arg(ap,char*);
printf("%s",value);
}break;
case 'f': //浮点型
{
double value;
value=va_arg(ap,double);
printf("%f",value);
}
break;
default://直接打印%
printf("%%");
}
if(*(pcmd+1)=='\0')
return;
//pcmd->'%' pcmd->'d' "abc%"
translate(pcmd+2,ap);
}
}
//打印
void myprintf(const char cmd[],...)
{
//获取实参列表
va_list ap;
va_start(ap,cmd);
//解析
translate(cmd,ap);
//释放
va_end(ap);
}
int main()
{
//printf("%jbcd\n");
//printf("abcdef\n");
//myprintf("%x %s %c %c %c %f\n%",100,"abc",'a','c','b',3.14);
printf("%s",100);
return 0;
}
我自己的非递归
/*
//传递过程中会类型提升(隐式类型转换)char变int,float变double
//const int* p; p++不允许 p+1允许
*/
#include<iostream>
#include<stdio.h>
#include<stdarg.h>
#include<string>
using namespace std;
void print(const char* fmt,...)
{
va_list ap;
va_start(ap,fmt);
//传递过程中会类型转换,所以取出来的只有以下类型
int arg0;//整形
double arg1;//double型
char arg2;//字符型
char* arg3;
const char* tmp=fmt;//fmt是字符常量不能遍历,所以定义新的遍历
while(*tmp!='\0')
{
if(*tmp=='%')
{
switch(*(++tmp))//%号的后一位
{
case 'd':case 'c':case 'x':case 'o':
{
// cout<<"here";
char cmd[3]="%";
cmd[1]=*tmp;//构造性的输出串
arg0=va_arg(ap,int);
// cout<<arg0; 都以整数输出
printf(cmd,arg0);
break;
}
case 's':
{
arg3=va_arg(ap,char*);
cout<<arg3;
break;
}
case 'f':
{
arg1=va_arg(ap,double);
cout<<arg1;
break;
}
default: cout<<"%%";//直接打印%d
}
}
else
{
arg2=*tmp;
cout<<arg2;
}
tmp++;
}
va_end(ap);
}
int main()
{
int i=100;
print("I love China %d %s %c %f %% \n",i,"abc",'o',3.14);
return 0;
}