- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
- 1996年以来湖人的交易点评.doc
- 1宋氏番邦闻见录 by十方.doc
- 2001年(下)电子商务概论试题.doc
- 2004-2009年历年注册安全工程师案例及答案.doc
- 2004届高三文科质量检测卷.doc
- 2006 —2007学年度八年级《中国历史》单元测试卷(三).doc
- 2004DXP常见问题.doc
- 2006年普通高等学校招生全国统一考试大纲— 文综历史.doc
- 2006年湖北八校第二次联考 语文试卷.doc
- 2007 年上半年每日一句汇总TXT.doc
- 半导体材料性能提升技术突破与应用案例分析报告.docx
- 半导体设备国产化政策支持下的关键技术突破与应用前景报告.docx
- 剧本杀市场2025年区域扩张策略研究报告.docx
- 剧本杀行业2025人才培训体系构建中的市场需求与供给分析.docx
- 剧本杀行业2025年人才培训行业人才培养模式创新与探索.docx
- 剧本杀行业2025年内容创作人才需求报告.docx
- 剧本杀行业2025年区域市场区域剧本市场消费者满意度与市场竞争力研究报告.docx
- 剧本杀市场2025年区域竞争态势下的区域合作策略分析报告.docx
- 剧本杀行业2025人才培训与行业人才培养模式创新.docx
- 剧本杀行业剧本创作人才心理素质培养报告.docx
文档评论(0)