我想知道所有这些输出功能,基本上他们做了什么? 因为我经历了很多次,在遇到它时,printf并不总是在屏幕上打印,我听说它放入缓冲区或类似的东西。 所以如果有人能说清楚实际发生了什么。 如果还可以给出关于输入函数的相同信息,那将是很好的。 你告诉它的深度会更有帮助。 。 感谢。
答案 0 :(得分:1)
大部分时间printf都是这样的:(没有缓冲部分和其他小东西)
表示%s标志:
void my_putchar(char c)
{
write(1, &c, 1);
}
int my_putstr(char *str) // printf("%s", "hello");
{
int i;
i = 0;
while (str[i] != '\0')
{
my_putchar(str[i]);
i = i + 1;
}
}
和%d标志
void my_put_nbr(int nb) // printf("%d", 100);
{
if (nb > 9)
my_put_nbr(nb / 10);
my_putchar(nb % 10 + '0');
}
答案 1 :(得分:0)
<强> printf的强>
将format指向的C字符串写入标准输出(stdout)。 如果format包含格式说明符(以%开头的子序列), 格式化并插入格式后的附加参数 在结果字符串中替换它们各自的说明符。
这里已经很好地解释了printf实际上是如何运作的:
您的软件调用printf()。
printf()处理你的字符串和args,然后需要执行 内核函数,因为无法在第3环中写入文件。
printf()生成一个软件中断,放入寄存器中 内核函数的编号(在这种情况下,是write()函数)。
内核处理请求,写入文件(stdout是一个 文件描述符)。
完成后,内核使用iret返回软件的代码 指令。
软件的代码仍在继续。
ISO C99第7.19.3 / 3条
中的一些有用的行如果未缓冲流,则会显示字符 来源或目的地尽快。除此以外 字符可以被累积并发送到主机或从主机发送 环境作为障碍。
当流完全缓冲时,字符应该是 当缓冲区时,作为块传输到主机环境或从主机环境传输 充满了。
当流被缓冲时,字符应该是 当换行时,作为块发送到主机环境或从主机环境发送 遇到了角色。
此外,字符旨在作为块传输 当填充缓冲区时,请求输入时的主机环境 在无缓冲的流上,或在缓冲的行上请求输入时 需要从主机传输字符的流 环境。
对这些特性的支持是实现定义的,并且可能 受到setbuf和setvbuf函数的影响。