【0】README


【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 的 实现步骤的大致方向清楚了);

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. Linux Shell 截取字符串
  2. xp
  3. java开发环境搭建
  4. java连接sql server2005
  5. linux基础-第十三单元 硬盘分区、格式化及文件系统的管理二
  6. 【项目经验】--EasyUI DataGrid之右键菜单
  7. ligerui_ligerTree_003_配置url参数,加载“树”
  8. 图片流Base64编码 转图片
  9. 【转】IOS NSTimer 定时器用法总结
  10. secureFX中出现中文乱码修改方法
  11. OC类的本质及分类
  12. Web前端常用快捷键总结(OS X系统)
  13. javascript的null 和undifined
  14. node.js之路由,中间件,ge请求和post请求的参数
  15. memcached经典问题和现象
  16. 【汇编语言】DOXBox 0.74 常用debug命令
  17. CSS3_3D 变换
  18. 怎么样启用红米手机5的ROOT权限
  19. Python全栈之路----常用模块----hashlib加密模块
  20. 1、mysql初识

热门文章

  1. Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning 回文串划分
  2. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---43
  3. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---26
  4. [翻译][Nokogiri官方教程] 解析HTML/XML文档 / Parsing an HTML/XML Document
  5. C#执行CMD命令并接收返回结果的实现方法
  6. mysql5.7 mysql库下面的user表没有password字段无法修改密码
  7. Fio IO性能测试
  8. 自做CA自签发SSL证书
  9. Codeforces Gym101473 E.Dangerous Dive (2013-2014 ACM-ICPC Brazil Subregional Programming Contest)
  10. Java IO 流 设计模式