70,032
社区成员




void NewPrintf(char *formats,...);
main()
{
NewPrintf("1234 i%x% %c%c%c%c jklm %%56 %d %c %d %c",'a','b','c','d','e','f','g','h');
}
void NewPrintf(char *fmt,...)
{
int state,i;
char *p;
int m;
p=fmt;
i=state=0; /* i显示到0xb8000000的步长,state判断%后的状态 */
m=0; /* m栈的步长为2,故m++;m++; 这里的初值必须为0 ,初值为2则编译不过去 */
while (*p!=0){
if (state==1){ /* 前面是%状态被设为1 */
if (*p!='c'){
if (*p!='d'){
/* 显示%及*p; */
*(char far *)(0xb8000000+160*10+80+i+i)='%';
*(char far *)(0xb8000000+160*10+81+i+i)=2;
i++;
*(char far *)(0xb8000000+160*10+80+i+i)=*p;
*(char far *)(0xb8000000+160*10+81+i+i)=2;
state=0;
i++;
}
else
{
/* 用%d显示16进制;待修改成10进制 */
*(char far *)(0xb8000000+160*10+80+i+i)=((*(int *)(_BP+6+m))/16+48);
*(char far *)(0xb8000000+160*10+81+i+i)=2;
i++;
*(char far *)(0xb8000000+160*10+80+i+i)=((*(int *)(_BP+6+m))%16+48);
*(char far *)(0xb8000000+160*10+81+i+i)=2;
state=0;
i++;
m++;
m++;
}
}
else
{
/* 用%c显示; */
*(char far *)(0xb8000000+160*10+80+i+i)=*(int *)(_BP+6+m);
*(char far *)(0xb8000000+160*10+81+i+i)=2;
state=0;
i++;
m++;
m++;
}
}
else
{
if (*p!='%') { /* 在前面没有%的情况下监测当前字符,如果不是%则直接输出到屏幕 */
/*输出*(int *)(_BP+6+m)到屏幕;*/
*(char far *)(0xb8000000+160*10+80+i+i)=*p;
*(char far *)(0xb8000000+160*10+81+i+i)=2;
i++;
}
else /* 在前面没有%的情况下监测当前字符,如果是%则设置状态为1 */
state=1;
;
}
p++; /* while循环的步长 */
}
return 0;
}
#include "stdio.h"
#include "stdlib.h"
void myprintf(char const *format,...);
main()
{
myprintf("interger:%d,string:%s,float:%f,char:%c%n",1,"abcdef",1.2,'A');
myprintf("%s","i love you!");
}
/*版本一*/
void myprintf(char const *format,...)
{
va_list ap;
char *ps,buf[32];int e;float f;
va_start(ap,format);
while ( *format )
{
if ( *format!='%')
{
putchar(*format);
format++;
continue;
}
/*
* %s:输出字符串,%d:输出整数,%f:输出浮点数,%c:输出字符,%n:换行
*/
switch( *++format)
{
case 's':ps=(char *)va_arg(ap,char const *);while ( *ps ){ putchar (*ps);ps++;}break;
case 'd':e=va_arg(ap,int);itoa(e,buf,10);for(ps=buf;*ps;ps++) putchar(*ps);break;
case 'f':f=va_arg(ap,double);sprintf(buf,"%f",f);for(ps=buf;*ps;ps++) putchar(*ps); break;
case 'c':putchar(va_arg(ap,char));break;
case 'n':putchar(10);break;
default:putchar(*format);
}
format++;
}
}
/*版本二*/
/*
void myprintf(char const *format,...)
{
char *buf=(char *)malloc ( 1024);
va_list ap;
if ( !buf ) {printf("get memory error!");exit(1);}
va_start(ap,format);
vsprintf(buf,format,ap);
va_end(ap);
puts(buf);
free(buf);
}
*/
/*版本三*/
/*
void myprintf(char const *format,...)
{
int address;
char *p=(char *)(&format),*buf,ps[128]; /*p指向栈顶*/
p+=sizeof(char *);
while ( *format)
{
if ( *format!='%')
{
putchar(*format);
format++;
continue;
}
switch (*++format)
{
case 's':address=*((int *)p);p+=sizeof(char *);buf=(char *)address;while (*buf) {putchar(*buf);buf++;}break;
case 'd':itoa(*((int *)p),ps,10);p+=sizeof(int);for(buf=ps;*buf;buf++) putchar(*buf);break;
case 'f':sprintf(ps,"%f",*((double*)p));p+=sizeof(double);for(buf=ps;*buf;buf++) putchar(*buf);break;
case 'c':putchar(*p);p++;break;
case 'n':putchar(10);break;
default:putchar(*format);
}
format++;
}
free(p);
free(buf);
}
*/