printf源代码的分析

原创 2015年07月09日 08:57:56

1、常见的格式

printf"show int: %d, char: %s", int val1, char *val2);
printfconst char *fmt, ...);

2、处理方式

  • 处理过程中主要采用了一个指针va_list 、3个函数 va_start()va_arg()va_end()

  • va_list args; //声明args,用于存储了所有的val1,val2,……,实际上是一个指针而已

  • va_start(args, fmt); // 得到第一个可变参数的地址,(也就是args的地址是从fmt之后开始,也就是”show int: %d, char: %c”之后)

  • int getval1 = va_arg(args, int); // 比如:第一个是int的型,则根据int型获取val1

  • 对fmt字符串进行一个循环操作,如果遇到”%号”,判断并获取数据类型,再通过va_arg()获取数据;

  • 注:int类型如何获取,通过对fmt字符串的判断,根据第一个”%号”后面的字符来确定 第一个参数的类型

  • va_end(args); // 清空args的指针

3、伪代码

printf(const char * fmt, ......)
{
    val_list args;   

    va_start(args, fmt);  // 获取第一个可变参数的地址,

    char *str;

    for(str = buf; *fmt; ++fmt)
    {
        // 如果不等于%继续查找,同时存储于str
        if (*fmt != '%') {
            *str++ = *fmt;
            continue;
        }

        遇到%号后,对%号后面的进行判断, 同时存储于str
        switch()
        case 'd':  va_arg(args, int); // 获取int类型    获取一个参数后,指针移至下一个参数
        case 's':  va_arg(args, char) // 获取char型
        case 'p'   va_arg(args, void *); // 获取指针
    }

    va_end(args);  // 将args指针置空

    最后str字符串就是printf最后的输出结果
}

用C语言写自己的printf函数

嵌入式系统经常需要用到printf对硬件调试,而系统的printf又太过臃肿。所以自己根据实际需要,写一个小型是个自己的printf就非常重要了。...
  • qq_16777851
  • qq_16777851
  • 2016年11月04日 17:23
  • 2227

实现简单的printf函数

首先,要介绍一下printf实现的原理 printf函数原型如下: int printf(const char* format,...); 返回值是int,返回输出的字符个数。 例如: int mai...
  • fengxinlinux
  • fengxinlinux
  • 2016年07月29日 15:54
  • 5649

如何分析一个开源工程的代码

开放源代码的项目,通常都是不完整的,就是说:只有源代码,没有完整的产品使用说明书,没有软件开发过程中的完整文档,源码中的注释也很少。之所以会这 样,可能是因为作者们有所保留,只开放源码,不开放关键的文...
  • Andy710660541
  • Andy710660541
  • 2016年03月21日 17:37
  • 2842

printf源代码分析

  • 2015年03月19日 15:07
  • 6KB
  • 下载

gcc源代码分析,expand_call()函数和printf("Hello, world!\n");的关系

expand_call()函数在expr.c文件中。 下面是expand_call()函数的主要调试结果,记录之。 主要是加入了debug_tree()函数和debug_rtx()函数。 d...
  • sitelist
  • sitelist
  • 2015年01月05日 10:58
  • 1168

内核printf源代码分析

原文:http://blog.chinaunix.net/space.php?uid=268349&do=blog&id=2453286 打开Source Insight来阅读EduOS的源代码,我...
  • Bresponse
  • Bresponse
  • 2011年11月10日 15:39
  • 336

内核printf源代码分析.

内核printf源代码分析. 打开Source Insight来阅读EduOS的源代码,我们在stdio.c里找到了printf的实现代码.首先看看对printf的定义: [Copy ...
  • qq810277189
  • qq810277189
  • 2013年08月25日 15:28
  • 298

printf的源代码

  • 2011年08月18日 13:39
  • 305KB
  • 下载

STM32实现printf和scanf源代码,保证能运行

  • 2012年08月14日 10:11
  • 462KB
  • 下载

源代码 关于printf

在里面发现宏   #define do_div(n,base) 展开后 奇怪的代码测试如下: #include 2 3 int main() 4 { 5 char tmp[...
  • h3139597
  • h3139597
  • 2012年03月02日 23:17
  • 1319
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:printf源代码的分析
举报原因:
原因补充:

(最多只允许输入30个字)