自定义打印输出函数格式,模拟printf函数
2011-08-29 17:28
477 查看
/************************************************************* 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'; }
相关文章推荐
- 自定义打印输出函数格式,模拟printf函数
- 自定义printf函数,方便设置打印函数到开关
- abap smartforms使用自定义格式打印输出重叠解决方案
- abap smartforms使用自定义格式打印输出重叠解决方案
- Swift 自定义打印, 自定义输出函数 ,自定义log, Debug
- javascript自定义函数参数传递为字符串格式
- 实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定, 输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表。 (无返回值需要传参)
- UStore-自定义JDF文件格式输出
- C# Console.WriteLine()函数中{}输出格式详解
- 格式输出iomanip的几个函数
- C#自定义数字格式字符串输出示例
- 选择某种Map集合保存学号从1到15的学员的学号(键)和姓名(值),学号用字符串表示,输入的时候要以学号乱序的方式存入Map集合,然后按照学号从大到小的顺序将Map集合中的元素输出打印。需要自定义Ma
- OC中NSLog函数输出格式
- JAVA中自定义日志输出格式及自定义文件处理器的实现
- 输入输出格式标记位、格式常量、格式设置函数
- js调用浏览器打印模块实现点击按钮触发自定义函数
- BCB中用FormatFloat函数控制浮点数据的输出格式
- php 打印、显示、输出函数 收集
- 实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定, 输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表。
- C#时间函数的用法C#时间格式输出