自己写printf函数

来源:互联网 发布:手机照片写字软件 编辑:程序博客网 时间:2024/06/09 00:14

自己写printf函数。想法:

 

打印位置:

dh=行,dl=列。

 

 

1 printf("%c,%d,%s,%c/n",'a',2,"hello",'d')为例。

 "%c,%d,%s,%c/n"里找要打印的信息属性。这个字符串的长度也能求出来。(0AH是‘/n’的ASICⅡ)

 

 

2)检测"%c,%d,%s,%c/n",如果当前是%C则打印出字符,是%D打印int型数据,是%S则打印字符串。是‘/n’,行号加1

如果是int数据,如234,要用逐位摸除方法,转换程字符‘2’,‘3’,‘4’再打印。因为显存上显示的都是字符型。

 (3)检测到非上述信息,直接打印。

程序如下:

 


void print(char *,...);
main()
{
 clrscr();
 printf("%d,%c",123,'x');
 print("%c,ccc%s,%d/n%d,%c",'a',"hello",1123,5,'d');

}
void print(char *p,...)
{

    int count=0;      /* the station of int and char used in stack */
    int data=0;
    int signal=0;

    char *buffer=(char *)malloc(10);
    char *str=0;
    int dh=10;
    int dl=0;

    while(*p!=0)
   {

 if(*p=='%' && *(p+1)=='c')
 {
    *(char far *)(0xb8000000+160*dh+2*dl)=*(int *)(_BP+6+count+count);
           count++;
     dl=dl+1;
    p+=2;
 }
      else if(*p=='%' && *(p+1)=='d')
        {
           data=*(int *)(_BP+6+count+count) ;
    count++;
    p+=2;
    if(data==0){  *(char far *)(0xb8000000+160*dh+2*dl)=0x30; dl+=1;}
    if(data<0) { signal=1; data=-data; }
           buffer[0]=0;
           while(data!=0)
           {
               buffer++;
               *buffer=data%10+0x30;
               data=data/10;
           }
           while(*buffer!=0)
           {
             if(signal==1)
             {
        *(char far *)(0xb8000000+160*dh+2*dl)='-';
        dl++;
               signal=0;
             }
        *(char far *)(0xb8000000+160*dh+2*dl)=*buffer;
        buffer--;
        dl++;
    }

 }
 else if(*p=='%' && *(p+1)=='s')
 {
/*这里进行一个类型转化,把从栈里取得的int型数据,转换为char型指针*/   

str=(char *)*(int *)(_BP+6+count+count);

    count++;
    while(*str!=0)
    {
      *(char far *)(0xb8000000+160*dh+2*dl)=*str;
       str++;
       dl++;
    }
    p+=2;

 }
 else if(*p=='/n')
 {
     dh++;
     dl=0;
     p++;
 }

        else
        {
  *(char far *)(0xb8000000+160*dh+2*dl)=*p;
   dl++;
   p++;
        }

   }
}

 

 

 

原文:http://blog.csdn.net/zy_sky/archive/2011/04/16/6327514.aspx

原创粉丝点击