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函数把它们打印出来。
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
- printf函数的原理1
- printf 函数的实现原理
- printf 函数的实现原理
- printf 函数的实现原理
- printf函数的实现原理
- printf函数实现原理
- printf函数实现原理
- c语言中可变参数的原理---printf()函数
- 解析可变参数函数的实现原理(printf,scanf)
- 解析可变参数函数的实现原理(printf,scanf)
- 解析可变参数函数的实现原理(printf,scanf)
- 解析可变参数函数的实现原理(printf,scanf)
- 可变参数表函数的原理及实现(printf实现)
- c语言中可变参数的原理---printf()函数
- C打印函数printf的一种实现原理简要分析
- printf的实现原理
- printf的实现原理
- printf函数原理以及可变参函数
- java上传文件到服务器
- java io系列12之 BufferedInputStream(缓冲输入流)的认知、源码和示例
- 嵌入式linux之高级c语言专题--指针3
- 重装系统的详细步骤及解析
- LeetCode(386)Lexicographical Numbers
- printf函数的原理1
- 利用隐藏域/HttpSession实现简易问卷
- Android中Broadcast Receiver组件详解
- 现代C++函数式编程
- android集中常见的图片加载框架的小结
- CSS3——布局样式
- java io系列13之 BufferedOutputStream(缓冲输出流)的认知、源码和示例
- 线程的创建
- 菜单的状态与工具栏--孙鑫MFC第六课第二部分