⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newprintf1.cpp

📁 类似于printf的函数
💻 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 + -