2

我想知道所有这些输出函数,基本上它们是做什么的?因为我经历过很多次 printf 在遇到它时并不总是在屏幕上打印,而且我听说它会放入缓冲区或类似的东西。因此,如果有人可以清楚地说明实际发生了什么。如果也可以提供有关输入函数的相同信息,那就太好了。你说得越深,就会有很大帮助。. 谢谢。

4

2 回答 2

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');
}
于 2013-10-05T07:44:31.810 回答
0

打印

将 format 指向的 C 字符串写入标准输出 (stdout)。如果 format 包含格式说明符(以 % 开头的子序列),则 format 后面的附加参数将被格式化并插入到结果字符串中,替换它们各自的说明符。

这里已经很好地解释了printf的实际工作原理:

  1. 您的软件调用 printf()。

  2. printf() 处理您的字符串和 args,然后需要执行内核函数,因为在 ring 3 中无法写入文件。

  3. printf() 生成软件中断,将内核函数的编号(在这种情况下为 write() 函数)放入寄存器。

  4. 软件执行被中断,指令指针移动到内核代码。所以我们现在在环 0 中,在一个核函数中。
  5. 内核处理请求,写入文件(stdout 是文件描述符)。

  6. 完成后,内核使用 iret 指令返回到软件代码。

  7. 软件的代码继续。

ISO C99 第 7.19.3/3 节中的一些有用行

当流未缓冲时,字符应尽快从源或目标出现。否则,字符可能会作为一个块累积并传输到主机环境或从主机环境传输。

当一个流被完全缓冲时,当缓冲区被填满时,字符将作为一个块传输到主机环境或从主机环境传输。

当流被行缓冲时,当遇到换行符时,字符旨在作为块传输到主机环境或从主机环境传输。

此外,当缓冲区被填满时,当在非缓冲流上请求输入时,或者当在需要从主机环境传输字符的行缓冲流上请求输入时,字符将作为块传输到主机环境.

对这些特性的支持是实现定义的,并且可能会受到 setbuf 和 setvbuf 函数的影响。

于 2013-10-05T07:28:46.857 回答