首页 > C语言中printf实现的猜测

C语言中printf实现的猜测

在如下代码中:

#include<stdio.h>
main(int argc , char const* argv){
    char *ch = "HelloWorld";
    printf("%s\n",ch);
    printf("%s\n",ch+1);    
}

运行结果为:

HelloWorld
elloWorld

因此我推断:printf()在打印字符串时,当传入参数:指向字符串某个字符的地址时,该函数将一直打印后续的字符串,直到'\0'字符串的出现为止。
不知道我得判断是否正确,我在Ubuntu下查到的/usr/include/stdio.h 的源码,但是只是看到了

extern int printf(char * , char *,....);

不知道具体在哪里实现的,求解,求指导。


把代码反编译看一下不就行了。。。一个INT中断而已


你猜测的是对的,但我只能说你这是在舍本逐末。楼上所谓的“研究得很深”和研究汇编更是搞笑,不要误导别人了。

你应该好好查看手册,你所猜测的在手册里说明得很详细。在手册中也会告诉你它的实现在什么地方。

printf的实现在clib里,比如linux下一般就是glibc。

如果想学习printf的实现,可以去下一份glibc的源码查看一下,一般系统中是不会带c库的源码的,glibc的地址是:http://www.gnu.org/software/libc/

printf是在stdio.h中定义的,所以你直接在glibc源码中的stdio相关目录下去查看,在glibc2.16中是stdio-common目录。

再补充一点,你的系统有可能没有装man pages,你可以通过下面的命令:

man 3 printf

如果没有结果,那你就得先装man pages,当然,也可以去
http://www.kernel.org/doc/man-pages/

查看. 或者直接去这下载:

http://tldp.org/manpages/man.php


提醒一下,对于%s,你说的是对的,
对于%x,%d,printf解析后会往后移动4字节,
对于%ll则是解析后往后移动8个字节,这里需要注意


printf打印什么,要根据第一个参数传的格式。
你问题里的格式传了 %s ,所以printf就会以字符串的方式去打印。
而字符串这个数据结构,在c语言里就是一段连续的内存中存储的字符集,以\0表示结束。
符合你的猜测,但这与printf无关,是字符串的结构。
如果你传%c进去,那就只会打印这个指针指向的这个字符。


简单的printf实现
http://www.xappsoftware.com/wordpress/2011/01/17/a-tiny-printf-for-embedded-systems/


loki是专家比较牛逼。我没那么有能力去研究汇编代码,我只知道printf在Linux平台是由glibc实现的,具体代码可以参考
http://sourceware.org/cgi-bin/cvsweb....
http://sourceware.org/cgi-bin/cvsweb....


楼主研究的很深

void
__printf (const char *format,
          void (*output) (char, void *), void *aux, ...) 
{
  va_list args;

  va_start (args, aux);
  __vprintf (format, args, output, aux);
  va_end (args);
}

http://from-pintos-to-burritos.google...

【热门文章】
【热门文章】