我在标准输出中的打印件顺序不正确

My prints in the standard output aren't in good order

我想做一个删除标准输出中打印字符的功能。然而事实证明它在我实际的 printf 之前打印了 '\b' 我尝试打印 t 它之前也打印过。 我用自己的函数打印 '\b',但它确实适用于 putchar。我不明白为什么。

这是我的代码:

void    ft_putchar_a(char c)
{
    write(1, &c, 1);
}

void    delete_std(int n)
{
    int i;

    i = 0;
    while (i < n)
    {
        ft_putchar_a('\b');
        i++;
    }
}

int main()
{
    printf("Hello");
    delete_std(5);
    return (0);
}

你的问题很简单。标准库维护它写入每个文件(包括标准输出)的数据缓冲区。 printf 将数据写入该缓冲区。

write 通常不使用该缓冲区。因此,您正在将数据写入缓冲区,然后调用 write 写入“过去”缓冲区,然后当您的程序退出时,数据从缓冲区刷新到流中——但是退格键已经写了。

有几种方法可以解决这个问题。最简单的方法是对所有数据使用标准 C 输出例程。例如:

void    ft_putchar_a(char c)
{
//    write(1, &c, 1);
      fputc(c, stdout); 
}

这样,所有的输出都会被写入缓冲区,并保持有序。您可以(理论上)改为通过 write 执行所有输出,但除非您添加自己的缓冲,否则效率会非常低(这就是标准库首先进行缓冲的原因)。

另一种可能性(但有点难看,IMO)是在您通过 printf:

写入后刷新缓冲区
printf("Hello");
fflush(stdout);
delete_std(5);

这将使这个特定的代码工作,但留下了根本问题,所以任何时候你使用你的 ft_putchar_a,你都会 运行 进入同样的事情。我想你可以将补丁合并到 ft_putchar_a 本身,以至少确保它始终如一地发生:

void f_putchar_a(char c) {
     fflush(stdout);
     write(1, &c, 1);
}

...但是始终使用 C 输出更清晰、更直接。