关于printf函数的所思所想

时间:2021-09-29 02:55:42

缘起大一下学期,C语言程序设计徐小青老师的随口一提,经娄嘉鹏老师提醒,我觉得应该自己整理清楚这一问题。涉及网上资料将会标明出处。

关于printf函数的所思所想


* printf的定义

printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。

格式输出,它是c语言中产生格式化输出的函数(在 stdio.h 中定义)。用于向终端(显示器、控制台等)输出字符。

格式控制由要输出的文字和数据格式说明组成。

原型:extern int printf(const char *format,...);

**参考百度百科词条 http://baike.baidu.com/view/410546.html **

* printf函数-c源码

从课程原因角度考虑,我搜索了一下printf函数的c源码。

    ...
switch (cntrl_string[pos]) {
    case 'c':
  putchar (va_arg (ap, unsigned char));
  cnt_printed_chars++;//已经被printf输出的字符个数
  break;
...
case 's':
  chptr = va_arg (ap, unsigned char*);//cnptr是用来在处理字符串时的位置指针
  i = 0;
  while (chptr [i]) {
   cnt_printed_chars++;
   putchar (chptr [i++]);}
break;
...

在上述代码中引用了 int putchar (int c),同样以switch-case语句为主体,

至于void printChar (const byte ch),个人还看不懂

**参考sgq116300博客 http://blog.csdn.net/sgq116300/article/details/1863384 **

另一个版本在linux内核中的printf源码,仅用了252行

**参考ChinaUnix博客 http://blog.chinaunix.net/uid-24567872-id-87686.html **

* printf函数-汇编语言代码

因为徐小青老师课上同样提到了汇编语言,这也是信息安全专业的课程之一。在程序设计课程中使用的codeblock已经用编译器完成了汇编。

在知乎网友Milo Yip关于“学习汇编有什么好处”的回答中提到,

“汇编是一般程序員能为机器编程的底层语言(现代的CPU/GPU还会把指令再分解成微指令),所以学习汇编能让程序員知道机器在软件层面上的最底层操作。”

在博友范志东(Florian)的《printf背后的故事一文中》,详细的描述了printf的调用轨迹,但因为个人能力有限我没有看懂glibc源代码中的printf源码。

仅就函数调用做了记录:

_IO_puts => _IO_sputn => _IO_XSPUTN => __xsputn => _IO_file_xsputn => _IO_new_file_xsputn

=> _IO_OVERFLOW => __overflow => _IO_new_file_overflow

=>_IO_do_write =>_IO_new_do_write

=> new_do_write

=>_IO_SYSWRITE => __write() => write() => _IO_new_file_write

=>write_not_cancel => write_nocancel

=> INLINE_SYSCALL  => INTERNAL_SYSCALL =>__kernel_vsyscall

**参考Florian博客 http://www.cnblogs.com/fanzhidongyzby/p/3519838.html **


综上分析:徐小青老师提及的上千行代码可能指的是汇编语言下的printf函数代码。

关于printf函数的所思所想的更多相关文章

  1. 可变参数列表与printf()函数的实现

    问题 当我们刚开始学习C语言的时候,就接触到printf()函数,可是当时"道行"不深或许不够细心留意,又或者我们理所当然地认为库函数规定这样就是这样,没有发现这个函数与普通的函数 ...

  2. printf函数

    printf函数的格式及含义 d                    以十进制带符号的形式输出整数(对正数不输出符号) o                    以八进制无符号的形式输出整数(不输出 ...

  3. Linux Linux下特殊的printf函数和fputs函数

    Linux下,printf函数必须以'\n'结尾才会立刻输出到屏幕,如果没有'\n'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),如果需要不换行的输出,一般可以使用write函数代替.'\n ...

  4. C语言printf()函数:格式化输出函数

    C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为:     int printf( char ...

  5. 关于printf函数输出先后顺序的讲解!!

    对于printf函数printf("%d%d\n",a,b);函数的实际输出顺序是这样的先计算出b,然后在计算a,接着输出a,最后在输出b:例子如下:#include<ios ...

  6. printf&lpar;&rpar;函数

    printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息. printf()函数的调用格式为: printf("<格式化字符串>", <参 ...

  7. C 中 关于printf 函数中度剖析

    题外话  这篇博文主要围绕printf函数分析的,主要讲解printf 使用C的可变参数机制, printf是否可重入(是否线程安全), printf函数的源码实现. 正文 1.C中可变参数机制 我们 ...

  8. printf函数重定向

    printf函数底层会调用fputc函数 /*重定向c库函数printf到USART1*/ int fputc(int ch, FILE *f) { /*发送一个字节数据USART1 */ USART ...

  9. php中sprintf与printf函数用法区别

    下面是一个示例:四舍五入保留小数点后两位  代码如下 复制代码 <?php$num1 = 21;echo sprintf("%0.2f",$num1)."<b ...

随机推荐

  1. JavaWeb配置外部应用的两种方式

    原来我们的项目放到webapps下,现在放到外面,也希望tomcat可以找到它!把应用放到tomcat之外,这就是外部应用了.应用已经不在tomcat中了,这时我们需要在tomcat中配置外部应用的位 ...

  2. bowtie1和bowtie2的比较

    1.对于长度大于50bp的reads,bowtie2更精确:而小于50bp的reads,bowtie1更精确更快速 2.bowtie2支持的reads长度没有上限,当然reads长度在50~1000b ...

  3. scrapy爬虫笔记&lpar;二&rpar;------交互式爬取

    开始网页爬取:(1)交互式爬取 首先,我们使用scrapy建立起爬虫的框架.在命令行中输入 scrapy shell “url” 如:scrapy shell “http://www.baidu.co ...

  4. 部署额外域控制器&comma;Active Directory

      部署额外域控制器 转自:http://yuelei.blog.51cto.com/202879/117599 如果域中只有一台域控制器,一旦出现物理故障,我们即使可以从备份还原AD,也要付出停机等 ...

  5. Java&period;util&period;concurrent包学习&lpar;一&rpar; BlockingQueue接口

    JDK1.7 BlockingQueue<E>接口 (extends Queue<E>) 所有父接口:Collection<E>,Iterable<E> ...

  6. poj Building a Space Station

    http://poj.org/problem?id=2031 #include<cstdio> #include<cstring> #include<cmath> ...

  7. 连载:面向对象的葵花宝典:思考、技巧与实践(39) - 设计原则 vs 设计模式

    它的设计原则,和设计模式,是否该用它? ============================================================================= 在& ...

  8. ThreadLocal父子线程传递实现方案

    介绍InheritableThreadLocal之前,假设对 ThreadLocal 已经有了一定的理解,比如基本概念,原理,如果没有,可以参考:ThreadLocal源码分析解密.在讲解之前我们先列 ...

  9. QSS样式表之PS黑色风格&plus;白色风格&plus;淡蓝色风格(开源)

    用QUI皮肤生成器制作皮肤,基本上不超过一分钟就可以生成一套自己想要的皮肤,只要设置八种颜色即可.本人非常喜欢这套黑色风格样式皮肤,特意分享出来,下载地址:https://download.csdn. ...

  10. 2018&period;07&period;30 cogs2632&period; &lbrack;HZOI 2016&rsqb; 数列操作d(线段树)

    传送门 线段树基本操作 区间加等差数列,维护区间和. 对于每个区间维护等差数列首项和公差,易证这两个东西都是可合并的,然后使用小学奥数的知识就可以切掉这题. 代码: #include<bits/ ...