printf函数的原理1

来源:互联网 发布:手机照片恢复软件免费 编辑:程序博客网 时间:2024/06/08 19:16
首先看一下printf函数的声明:
int printf( const char* format, ...);
这是一个带有可变参数的有int类型的返回值的函数。
在printf中,%和/都是具有特殊意义的字符,表示各种特殊的含义,这是在这个函数里面有定义的。
printf打印的是一个字符串,双引号里面的是一个字符串,如果有%和/,函数内部会把他们转换成相应的字符串。
模仿书上写一个简单的printf函数:
(参数必须都是int 类型)
int myprintf(char* fmt, ...) 
{
  char c;
  char* p=NULL;
  p = (char*) &fmt; //(让p指向fmt的首地址)指针变成了char类型的,一次加1.
  p += sizeof(fmt); //(让p指向字符串的末尾的下一个单元,即第一个int型的参数)
do
{
  c =*fmt;
  if (c != '%')
 {
    putc(c);
 }
else
 {


  switch(*++fmt)
 {
  case 'd ':
  putc( "%d ",*((int*)p));
  break;
  case 'x ':
  putc( "%#x ",*((int*)p));
  break;
  default:
  break;
 }
 p += sizeof(int); //只要遇到了百分号的情况,这个指针就向下加1(char型指针加4);
}
  ++fmt;
}while (*fmt != '\0');
p = NULL;
return;
}


int main(void)
{
int i = 1234;
int j = 5678;


myprintf( "the first test:i=%d ",i,j);
myprintf( "the secend test:i=%d; %x;j=%d; ",i,0xabcd,j);
return 0;
}


通过上一章讲述的串口,直接把putc放在这里,可以用串口来打印字符。


真正的printf函数中,列表中第一个参数是一个字符串,后面的参数是各个不同的。
上面这个小例子在字符串后面只能跟int型参数,所以一次指针移动四个字节。
在真的printf中,指针的定义,使用和移动是通过va_list,va_start,va_end来实现的。
va_start使指针指向字符串后第一个参数,va_end使指针指向NULL.
原函数中va_arg函数负责指针移动的大小。
原函数中把字符串先放在一个地方缓存起来(字符数组),然后再通过putc函数把它们打印出来。
0 0
原创粉丝点击