📄 newprintf1.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<iostream.h>
//#include<stdarg.h>
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
char * viPrintf(char* writeFmt,...);
/*不定参函数利用第一个参数writeFmtde地址和类型去寻找不定参数的地址的,并利用他们的类型
读取它们的值。因为它们在内存中是从第一个参数起依次顺序存储的。(参数从右向左进栈,先进
的会存在内存的高位,后进的会存在低位,因为函数栈的方向是向下的。)*/
void main()
{
char arry[4]={'A','2','3','\0'};//须有结束符'\0'
float farry[3]={2.3f,5.6f,78.9f};
int iarry[3]={9 ,10 ,11};
viPrintf( "%s,F:%f,the%dmand\n%,3d%,3ftongyong,%c assic:%d\n",arry,2.56,20,iarry,farry,'B','B');
}
char* viPrintf(char* writeFmt,...)
{
va_list parg=NULL;
//定义一个char*格式的指针parg,让它作为指向不定参数的指针。
int int_arg=0;
float float_arg=0;
char char_arg;
int str_arg_address;
char* str_arg_pointer=NULL;
int array_arg_address=0;
int* array_arg_pointer=NULL;
//float farray_arg_address=0;
//float* farray_arg_pointer=NULL;
int i=0;
va_start(parg,writeFmt);
//利用已经定义好的va_start有参宏将最后一个固定参数的地址赋给parg,通过宏定义会利用该地址找
//到第一个不定参的地址,从而执行完该语句后parg就已经指向了第一个不定参数。
while(writeFmt[i]!='\0')//将writeFmt字符串从头扫描一遍,以读出其中的每个字符,然后再去做相应的处理。
{
printf( "%c",writeFmt[i]);
if(writeFmt[i]=='%')
{
int t=i;
char array[50];//存放两个%之间的字符
int j=0;
while((writeFmt[t+1]!='%')&&(j<50))
{
array[j]=writeFmt[t+1];
j++;
t++;
}//取出两个%之间的内容,并将它们存放在数组array中。
int m=1;
int total=0;
int a=0;
if(!(((int)array[0]<=57)&&((int)array[0]>=48)))
//如果%后的第一个字符不是数值0~9。
{
switch(array[0])
{
case 'd':
int_arg=*(int*)parg;
printf("\b%d",int_arg);
parg+=sizeof(int);
break;
case 'f':
float_arg=(float)*(double*)parg;
printf("\b%f",float_arg);
parg+=sizeof(double);
break;
case 'c':
char_arg=*(char*)parg;
printf("\b%c",char_arg);
parg+=sizeof(int);//因为字节对齐
break;
case 's':
str_arg_address=*(int*)parg;
//取出在列表中存放的字符数组的首地址并将该地址值存入str_arg_address中。
str_arg_pointer=(char*)str_arg_address;
printf("\b");
do
{
printf("%c",*str_arg_pointer);
str_arg_pointer++;
}while((*str_arg_pointer)!='\0');
//printf( "%s ",str_arg_address);//和do循环任选一。
parg+=sizeof(char*);
break;
case ',':
array_arg_address=*(int*)parg;
//取出在列表中存放的字符数组的首地址并将该地址值存入str_arg_address中。
array_arg_pointer=(int*)array_arg_address;
//printf("\b");
while(((int)array[m]<=57)&&((int)array[m]>=48))
m++;
if(m>4)
printf("\nThis programme can not support such formate!sorry!\n");
else if(m==4)
{//说明此时的要求是三位数字
int hun=(array[1]-48)*100;
int ten=(array[2]-48)*10;
int one=array[3]-48;
total=hun+ten+one;
switch(array[4])
{
case 'd':
while(a<total)
{
printf("%d",*array_arg_pointer);
(char*)array_arg_pointer++;
a++;
}
parg+=sizeof(int*);
break;
case 'f':
while(a<total)
{
printf("%f",*array_arg_pointer);
(char*)array_arg_pointer++;
a++;
}
parg+=sizeof(int*);
break;
default:
printf("Sorry,you have given the wrong formate!");
break;
}
/*这里还要添加操作*/
}
else if(m==3)
{
int ten=(array[1]-48)*10;
int one=array[2]-48;
total=ten+one;
switch(array[3])
{
case 'd':
while(a<total)
{
printf("%d",*array_arg_pointer);
(char*)array_arg_pointer++;
a++;
}
parg+=sizeof(int*);
break;
case 'f':
while(a<total)
{
printf("%f",*array_arg_pointer);
(char*)array_arg_pointer++;
a++;
}
parg+=sizeof(int*);
break;
default:
printf("Sorry,you have given the wrong formate!");
break;
}
/*这里还要添加操作*/
}
else if(m==2)
{
total=array[1]-48;
switch(array[2])
{
case 'd':
while(a<total)
{
printf("%d",*array_arg_pointer);
(char*)array_arg_pointer++;
a++;
}
parg+=sizeof(int*);
break;
case 'f':
while(a<total)
{
printf("%f",*array_arg_pointer);
(char*)array_arg_pointer++;
a++;
}
parg+=sizeof(int*);
break;
default:
printf("Sorry,you have given the wrong formate!");
break;
}
/*这里还要添加操作*/
}
else if(m==1)//说明此时的array[1]不是数字,而是一个字符
{
total=1;
switch(array[1])
{
case 'd':
printf("%d",*array_arg_pointer);
parg+=sizeof(int*);
break;
case 'f':
printf("%f",*array_arg_pointer);
parg+=sizeof(int*);
break;
default:
printf("Sorry,you have given the wrong formate!");
break;
}
/*这里还要添加操作*/
}
parg+=sizeof(int);
break;
default:
//--i;//‘%’后接的是其他符号,则原样输出。
break;
}
}
/*else//如果%后边不是字符是数字
{
if(array[1]=='.')
{
int a=array[0];
int b=array[2];
char c=array[3];
printf("%a.bc",);
}
}*/
++i;//跳过‘%’后的格式控制符。
}
else if (writeFmt[i]=='\\')
{
if(writeFmt[i+1]='t')
printf("\\t");
else if(writeFmt[i+1]='n')
printf("\\n");
else if(writeFmt[i+1]='r')
printf("\\r");
else if(writeFmt[i+1]='"')
printf("\\\"");
else if(writeFmt[i+1]='\\')
printf("\\\\");
else if(writeFmt[i+1]='#')
printf("\\##");
}
i++;
}
//va_end(parg);//释放指针parg。
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -