printf 源代码实现.docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
printf 源代码实现

printf 源代码实现 打开Source Insight来阅读EduOS的源代码,我们在stdio.c里找到了printf的实现代码.首先看看对printf的定义: int printf (const char *cntrl_string, ...) 第一个参数cntrl_string是控制字符串,也就是平常我们写入%d,%f的地方.紧接着后面是一个变长参数. 看看函数头部的定义: int pos = 0, cnt_printed_chars = 0, i; unsigned char* chptr; va_list ap; 马上晕!除了ap我们可以马上判断出来是用来读取变长参数的,i用于循环变量.其他变量都不知道是怎么回事.不要着急,我们边看代码边分析.代码的第一行必然是 va_start (ap, cntrl_string); 用来初始化变长参数. 接下来是一个while循环 while (cntrl_string[pos]) { ... } 结束条件是cntrl_string[pos]为NULL,显然这个循环是用来遍历整个控制字符串的.自然pos就是当前遍历到的位置了.进入循环首先闯入视线的是 if (cntrl_string[pos] == %) { pos++; ... } 开门见山,上来就当前字符是否办断是否%.一猜就知道如果成立pos++马上取出下一个字符在d,f,l等等之间进行判断.往下一看,果真不出所料: switch (cntrl_string[pos]) { case c: ... case s: ... case i: ... case d: ... case u: ... 用上switch-case了. 快速浏览一下下面的代码. 首先看看case c的部分 case c: putchar (va_arg (ap, unsigned char)); cnt_printed_chars++; break; %c表示仅仅输出一个字符.因此先通过va_arg进行参数的类型转换,之后用putchar[1]输出到屏幕上去.之后是 cnt_printed_chars++,通过这句我们就可以判断出cnt_printed_chars使用来表示,已经被printf输出的字符个数的. 再来看看 case s: case s: chptr = va_arg (ap, unsigned char*); i = 0; while (chptr [i]) { cnt_printed_chars++; putchar (chptr [i++]); } break; 和case c,同出一辙.cnt_printed_chars++放在了循环内,也证明了刚才提到的他的作用.另外我们也看到了cnptr是用来在处理字符串时的位置指针.到此为止,我们清楚的所有变量的用途,前途变得更加光明了. 接下来: // PartI case i: case d: cnt_printed_chars += printInt (va_arg (ap, int)); break; case u: cnt_printed_chars += printUnsignedInt (va_arg (ap, unsigned int)); break; case x: cnt_printed_chars += printHexa (va_arg (ap, unsigned int), x); break; case X: cnt_printed_chars += printHexa (va_arg (ap, unsigned int), X); break; case o: cnt_printed_chars += printOctal (va_arg (ap, unsigned int)); break; // Part II case p: putchar (0); putchar (x); cnt_printed_chars += 2; /* of 0x */ cnt_printed_chars += printHexa (va_arg (ap, unsigned int), x); break; case #: pos++; switch (cntrl_string[pos]) { case x: putchar (0); putchar (x); cnt_printed_chars += 2; /* of 0x */ cnt_printed_chars += printHexa (va_arg (ap, unsigned int), x); break; case X: putchar (0); putchar (X); cnt_printed_chars

文档评论(0)

f8r9t5c + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档