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最后的输出结果
}

相关文章推荐

printf源代码分析

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

内核printf源代码分析

原文:http://blog.chinaunix.net/space.php?uid=268349&do=blog&id=2453286 打开Source Insight来阅读EduOS的源代码,我...

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

expand_call()函数在expr.c文件中。 下面是expand_call()函数的主要调试结果,记录之。 主要是加入了debug_tree()函数和debug_rtx()函数。 d...

内核printf源代码分析.

内核printf源代码分析. 打开Source Insight来阅读EduOS的源代码,我们在stdio.c里找到了printf的实现代码.首先看看对printf的定义: [Copy ...

printf的源代码

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

学习一点 C Runtime Library源代码 STRLEN.C STRNCAT.C STRCMP.C PRINTF.C

// VC6.0 的C Runtime Library源代码// 目录 CRT/SRC/ 中的  STRLEN.C  STRNCAT.C  STRCMP.C#define DOT_NOT_RUN //...

源代码 关于printf

在里面发现宏   #define do_div(n,base) 展开后 奇怪的代码测试如下: #include 2 3 int main() 4 { 5 char tmp[...

C自加运算在printf使用情况分析

  • 2015年11月07日 22:19
  • 123KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:printf源代码的分析
举报原因:
原因补充:

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