【0】README

  • 0.1)本文旨在对 printf 的 某一种 实现 原理进行分析,做了解之用;
  • 0.2) vsprintf 和 printf.c 的源码,参见
    https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/p309

【1】printf函数代码分析:

https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/p309/printf.c

  • P1)line66: va_list arg = (va_list)((char*)(&fmt) + 4); 要知道,对于C函数的调用,压栈顺序是从右参数往左边参数压栈,最右边参数最先压栈,最左边参数最后压栈;当然, (&fmt+4)指向的是 printf参数列表中 “…” 的首地址, 而“…” 代表的是参数列表(低地址到高地址,因为压栈顺序就是从高地址到低地址压栈):MAG_CH_ASSERT, exp, file, base_file, line ;
  • P2)结合以上叙述,我们得到 buf 就是个字符串数组(可以看做缓冲区)、 fmt = “%c assert(%s) failed: file: %s, base_file: %s, ln%d” 、arg = MAG_CH_ASSERT, exp, file, base_file, line 五个参数列表(即长度为5的20字节数组,每个地址4个字节);

【2】vsprintf 函数代码分析:

https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/p309/vsprintf.c

  • V1)line68: 调用 vsprintf 函数,同样的,参数压栈顺序是从右往左压栈, 我们看看vsprintf 的源码, 结合源码,我们的分析如下:

    • V1.1)line57~60 :非找到 fmt 中的 % 不可(%是定义输出格式的标识符), 且fmt 的字符是一个一个copy 到buf 的;
    • V1.2)line87~113:从参数列表 p_next_arg = args 中 抽取出 格式字符串,用q = inner_buf 来存储这些参数值;(显然,i2a()函数是 数字输出的不同进制的转换,16进制、10进制等),p_next_arg += 4; p_next_arg 为什么自加4 ,不用我多说了吧;
    • V1.3)line119~122:用inner_buf 存储的格式输出值 去填充 %定义的格式输出;
  • V2)再看看 vsprintf 对于 输出格式宽度是如何处理的?如%10d,等等;

    • V2.1)line62 :将align_nr 初始化为 0;
    • V2.2)line67~77: 是在 对 %下一个字符出现的可能情况的处理: 如果有两个 %% 并排,则表明输出为%、如果为0,待会cs=0、如果是其他情况,cs=空格;
    • V2.3)line78~82: 是在对 % 下一个字符是数字(打印宽度)的处理;
    • V2.4)line115~118:将cs 的值赋给 缓冲区 buf, 这里应该是把空格赋值过去,以填充打印宽度(说实话,这里我也没有好懂, 不过printf 的 实现步骤的大致方向清楚了);

C打印函数printf的一种实现原理简要分析相关推荐

  1. C语言学习笔记---打印函数printf()和sprintf()函数

    printf()函数   在C语言中使用最多的打印函数就是printf(),它可以将各种类型的数据转换为字符串输出. int main(int argc, char *argv[]) {char na ...

  2. 三个打印函数printf()/sprintf()/snprintf()区别

    先贴上其函数原型 printf( const char *format, ...)    格式化输出字符串,默认输出到终端-----stdout sprintf(char *dest, const c ...

  3. ZYNQ开发中SDK输出串口选择以及打印函数print、printf、xil_printf的差别

    ZYNQ开发系列--SDK输出串口选择以及打印函数print.printf.xil_printf的差别 前言 两个串口到底是谁在打印? print 和 printf 和 xil_printf 前言 在 ...

  4. ZYNQ开发系列——SDK输出串口选择以及打印函数print、printf、xil_printf的差别

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--SDK输出串口选择以及打印函数print.printf.xil_printf的差别 前言 两个串口到底是谁在打印? ...

  5. php 打印函数(echo , print, printf, print_f, var_dump)

    概要 了解php打印函数种类,简单实用以及功能区别 总结各个打印函数的实用场景以及相关最佳实践 函数介绍 1. echo echo用于输出一个或者多个字符串, 不换行 如果输出对象非字符串,会尝试将对 ...

  6. [转载] python函数分为哪几种_python常用函数

    参考链接: Python中的等分算法函数bisect Python常用函数 python中函数以两种形式呈现:一是可以自己定义的函数function,比如最常用的print()函数:另外一种是作为类的 ...

  7. 【小甲鱼C语言】课后笔记第一章第一节——打印(printf)

    目录 1."打印"就是"输出"的意思 2.使用 GCC 编译程序:gcc 源代码 -o 可执行文件. 3.printf 是格式化输出函数 a.函数概要 b.函数 ...

  8. 【❗划重点!C语言函数参数传递只有两种方式(值传递,地址传递),不支持“引用传递”!❗】

    引子 上篇文章<C语言函数传参の结构体数组篇>提到了C语言的函数参数传递方式,百度了一一一大圈,有说两种的,也有说三种的,简直把我搞晕了,"值传递和地址传递"是毫无疑问 ...

  9. c语言打印函数的使用

    在c语言编译的过程中printf函数起到十分重要的作用,他和打印机一样在电脑屏幕之上打印(显示)自己所需要的文本. c语言中打印函数比较重要其使用方法主要有二种: 一,直接打印文本或者数字,例如: # ...

最新文章

  1. 值得安利!推荐7款让人眼前一亮的宝藏软件
  2. 初学编程的小白 | 每日趣闻
  3. jQuery使用总结 - Core jQuery Selectors 选择器一2/4
  4. 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”...
  5. 大厂「offer 收割机」修炼记
  6. 有关 input默认宽度
  7. 让django完成翻译,迁移数据库模型
  8. 有关风向及风向处理的笔记
  9. python ant_python3.7.1ant+TKinter在Tkin中显示来自ANT+设备的实时数据
  10. WIN32汇编语言之通用对话框的使用
  11. 韦东山嵌入式Linux三大学习路线
  12. 龙芯2f灵珑一体机debian6系统重装
  13. 团队管理之绩效考核(OKR、KPI)
  14. 智课雅思词汇---二十、前缀syn-sym-syl是什么意思
  15. 大数据算法工程师知识点大全
  16. 51CTO学院学习心得
  17. 锂电池电量百分比计算_锂电池充放电理论及电量计算方法详解
  18. Win10 计算机扩展显示器闪黑屏
  19. 几种android实时视频网络传输方案比较
  20. Android破解锁屏密码(已root)

热门文章

  1. Music Problem
  2. [费用流]数字配对,新生舞会
  3. P6113-[模板]一般图最大匹配【带花树】
  4. 欢乐纪中某B组赛【2018.12.8】
  5. 【2018.3.31】模拟赛之四-ssl2408 句子【dp,字符串】
  6. 【线段树】Optimal Insertion(CF751E)
  7. 【启发式合并】【dfs】树数树(nowcoder 20107-C)
  8. 图书管理员【2017年普及组第二题】
  9. 双向广搜 8数码问题
  10. SpringCloud Greenwich(三)注册中心之zookeeper、Zuul和 gateway网关配置