自定義列印輸出函式格式,模擬printf函式
阿新 • • 發佈:2019-02-18
/************************************************************* FileName : testPrintfFunction.cpp FileFunc : printf引數模擬 Version : V0.1 Author : Sunrier Date : 2011-08-29 Descp : 簡單模擬printf函式 *************************************************************/ #include <stdio.h> #include <stdarg.h> #include <stdlib.h>//itoa()...... #include <string.h> #include <math.h> #include <ctype.h> #define MAXBUF 15 #define DEFAULT_PRECI 3 //符點型預設精度 int add(const int ,...); int myPrintf(const char *, ...); void ftoa(double InputData, char *OutputData,int DEFAULT_Vaule); int main ( void ) { int x,y; //int x1=0xFEd278df; int x1=8989; double doubleData=89.78623; int x3=0; char *s1="1234567"; x = add(4,1,2,3,4); y = add(3,1,2,3); printf("x=%B\n",x); printf("y=%3\n",y); myPrintf("Hello Sunrier!\n"); myPrintf("wwwwwwwww"); myPrintf("%s\n",s1); myPrintf("x3=%x\n",x3); myPrintf("x=%b\n",x); printf("x1=%b\n",x1); myPrintf("x1=%b\n",x1); myPrintf("x1=0x%x s=%s y=%d\n",x1,s1,y); myPrintf("doubleData=%f\n",doubleData); myPrintf("doubleData=%3f\n",doubleData); printf("doubleData=%3f\n",s1); return 0; } int add(const int n,...) { va_list arg;//定義va_list型別變數arg va_start(arg,n);//arg初始化,n是第一個可見引數名字;使arg指向第一個可選引數 int sum=0; int tmp =0; for(int i=0;i<n;i++) { tmp=va_arg(arg,int);//返回引數列表中的當前引數並使arg指向引數列表中的下一個引數 sum+=tmp; } va_end(arg);//把arg指標清為NULL return sum; } int myPrintf(const char *format, ...) { va_list ap; va_start(ap,format); //STRING //char ch; const char *str; //const char *str1; //OCT int value ; char buf[MAXBUF]; //HEX int offset; unsigned char ucI,ucLen; unsigned long ulValue; //unsigned char ucBuf[MAXBUF]; //unsigned long *ulpValue; //FLOAT double fdata; //BINARY while(*format) { if('%'!=*format) { putchar(*format++); continue; } switch(*++format) { case 's': str = NULL; str=va_arg(ap, const char *); for(;*str!='\0';str++) { putchar(*str); } ++format;//越過當前引數,移到下一個引數 break; case 'd': value=va_arg(ap,const int); memset(buf,0,sizeof(buf)); itoa(value, buf, 10); for (str=buf ;*str!='\0'; str++) { putchar(*str); } ++format; break; case 'x': offset = 0; ucLen = 0 ; ulValue=va_arg(ap,const int); memset(buf,0,sizeof(buf)); if( !ulValue ) { buf[ucLen] = ulValue ; str = buf ; putchar((*str+48)); ++format; break; } for( ucI=0;ucI<MAXBUF;ucI++) { if( pow(16,ucI)>ulValue ) { ucLen = ucI; break; } } for( ucI=0;ucI<ucLen;ucI++) { buf[ucI] = ulValue/pow(16,ucLen-ucI-1) ; ulValue = ulValue%(unsigned long)pow(16,ucLen-ucI-1); } //puts("0x"); for (str=buf ;*str!='\0'; str++) { if( (*str>=0) && (*str<=9) ) { putchar((*str+48)); } else { putchar((*str+87)); } } ++format; break; case 'X': offset = 0; ucLen = 0 ; ulValue=va_arg(ap,const int); memset(buf,0,sizeof(buf)); if( !ulValue ) { buf[ucLen] = ulValue ; str = buf ; putchar((*str+48)); ++format; break; } for( ucI=0;ucI<MAXBUF;ucI++) { if( pow(16,ucI)>ulValue ) { ucLen = ucI; break; } } for( ucI=0;ucI<ucLen;ucI++) { buf[ucI] = ulValue/pow(16,ucLen-ucI-1) ; ulValue = ulValue%(unsigned long)pow(16,ucLen-ucI-1); } //puts("0X"); for (str=buf ;*str!='\0'; str++) { if( (*str>=0) && (*str<=9) ) { putchar((*str+48)); } else { putchar((*str+55)); } } ++format; break; case 'f': fdata = va_arg(ap, double); memset(buf,0,sizeof(buf)); ftoa(fdata, buf, DEFAULT_PRECI); for (str=buf ;*str!='\0'; str++) { putchar(*str); } ++format; break; case '.': if( isdigit(*++format) ) { if( 'f'==(*++format) ) { --format; fdata = va_arg(ap, double); memset(buf,0,sizeof(buf)); int preci =*format-'0'; ftoa(fdata, buf, preci); for (str=buf ;*str!='\0'; str++) { putchar(*str); } ++format; ++format; } } else { --format; if( 'f'==(*++format) ) { fdata = va_arg(ap, double); memset(buf,0,sizeof(buf)); int preci =1; ftoa(fdata, buf, preci); for (str=buf ;*str!='\0'; str++) { putchar(*str); } ++format; } } break; case 'b': value=va_arg(ap,const int); memset(buf,0,sizeof(buf)); itoa(value, buf, 2); for (str=buf ;*str!='\0'; str++) { putchar(*str); } ++format; break; default : break; } } va_end(ap); return 0; } const double eps = 1e-12; char s[30]; void reverse(char *s) { int i , j; int len = strlen(s); for( i = 0 , j = len - 1 ; i < j ; i++ , j--) s[i]^=s[j]^=s[i]^=s[j]; } /* ftoa: convert double n to string s with digits*/ void ftoa(double n, char *s, int digits) { memset(s , 0 , sizeof(s)); int i = 0 , p; bool sign = true; if( n < 0 ) { sign = false; n = -n; } long t = ( long)n; n = n - t; if( t == 0) { s[i++] = '0'; } else { while( t != 0 ) { p = t % 10; t /= 10; s[i++] = p + '0'; } if(!sign) s[i++] = '-'; reverse(s); } if( fabs( n - 0.0 ) > eps ) { s[i++] = '.'; int cur_d = 0; while( cur_d < digits) { cur_d++; n *= 10.0; p = (long )n; n = n - p; s[i++] = p + '0'; } } s[i] = '\0'; }