【fizz源码分析】【源码冒险】【siki源码】printf 源码在哪

时间:2024-12-29 11:22:45 来源:gsm modem源码 编辑:c 软件注册 源码

1.LINUX下C语言的源码printf原理是什么?
2.c语言输出~~~~~
3.printf输出

printf 源码在哪

LINUX下C语言的printf原理是什么?

       Linux下C语言的printf是C标准I/O库中的格式化输出函数之一,将格式化数据写到标准输出stdout。源码

       1 printf首先把格式化数据写到标准I/O的源码fizz源码分析缓存,可以用setbuf和setvbuf设置缓存选项;

       2 调用write系统调用,源码把标准I/O的源码源码冒险缓存数据写到文件描述符STDOUT_FILENO,则标准I/O缓存中的源码siki源码数据就被送到内核缓存;

       3 内核把缓存中的数据输出到标准输出stdout对应的文件描述符STDOUT_FILENO。

       这是源码我的理解,基本应该就是源码这个流程,内核层次上的源码细节我就不清楚了。

       另外:

       1 printf返回写入的源码字节数;

       2 printf处理可变参数表使用的是va_list,当然也有相应的源码vprintf,它的源码第三个参数就是一个va_list

c语言输出~~~~~

       printf()函数是格式输出函数,打印输出的意思,"%格式\n"里面包含两层意思,,“%格式”表示你输出变量的格式,比如你输出整形,那么就是%d,如果你写成%C那么就与你输出变量的类型就不匹配,就不对了,\n是回车换行的意思,比如你输入两个变量printf“%d\n,%d”那么第一变量就会显示子第一行,第二个变量就显示在第二行。printf("%格式\n"+变量)中的变量代表你要输出的内容

printf输出

       ä¸‹é¢æ˜¯printf的源代码。可以看到,

       1,如果field_width输入是'*'的话,会从va_arg函数取值。

       å¦‚果取得的返回值field_width小于0的话,则取绝对值。

       è¿™å¯ä»¥è§£é‡Šï¼Œä¸ºä»€ä¹ˆ-7和7的效果是一样的。

       2,如果precision 输入是'*'的话,会从va_arg函数取值。

       å¦‚果取得的返回值field_width小于0的话,则取0值。

       è¿™å¯ä»¥è§£é‡Šï¼Œä¸ºä»€ä¹ˆ-2和0的效果是一样的。

       å…¶å®žï¼Œåªè¦precision 值小于0,都会和0的效果是一样的。

       æ¥¼ä¸»å¯ä»¥è¯•è¯•çœ‹ã€‚

       /* get field width */

       field_width = -1;

       if (is_digit(*fmt))

       field_width = skip_atoi(&fmt);

       else if (*fmt == '*') {

       ++fmt;

       /* it's the next argument */

       field_width = va_arg(args, int);

       if (field_width < 0) {

       field_width = -field_width;

       flags |= LEFT;

       }

       }

       /* get the precision */

       precision = -1;

       if (*fmt == '.') {

       ++fmt;

       if (is_digit(*fmt))

       precision = skip_atoi(&fmt);

       else if (*fmt == '*') {

       ++fmt;

       /* it's the next argument */

       precision = va_arg(args, int);

       }

       if (precision < 0)

       precision = 0;

       }

copyright © 2016 powered by 皮皮网   sitemap