您的位置:首页 > 其它

自定义打印输出函数格式,模拟printf函数

2014-08-16 17:22 309 查看
[cpp] view
plaincopyhttp://blog.csdn.net/sunrier/article/details/6730138

/*************************************************************

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';

}

(转自)http://blog.csdn.net/sunrier/article/details/6730138
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: