每次调用 printf() 是否创建一个新的内部缓冲区,或者所有后续调用都使用与第一个相同的缓冲区?

Does each call to printf() create a new internal buffer, or do all subsequent calls use the same buffer as the first?

当我使用 printf() 编写一个小程序时,我注意到在后面的 printf() 调用中使用的每个 \t 字符都从前一个 printf() 中的字符串末尾继续=13=]呼唤。

下面的图片和代码示例将阐明我的意思。

预期输出示例

printf("\t%d", i); // Prints multiples of 1
printf("\t%d", i * 2); // Prints multiple of 2
printf("\t%d", i * 3); // ... multiple of 3
printf("\t%d", i * 4); // ... multiple of 4
printf("\t%d", i * 5); // ... multiple of 5
printf("\n"); // Starts new line after each number printed.

要获得上图中所需的输出,我预计必须这样做:

printf("\t%d", i);
printf("\t\t%d", i * 2);
printf("\t\t\t%d", i * 3);
printf("\t\t\t\t%d", i * 4);
printf("\t\t\t\t\t%d", i * 5);

但这没有用,每个后续的 printf() 调用都从前一个字符串的末尾继续,这是有道理的,因为我们没有使用新行。

最终,我决定用一个 printf 调用来做同样的事情,尽管可读性稍差,而且开销可能更少。

printf("\t%d\t%d\t%d\t%d\t%d\n", i, i, i * 2, i * 3, i * 4, i * 5);

这让我很好奇 printf() 的工作原理。对该函数的每次后续调用是否使用与第一次调用创建的相同的内部缓冲区?

谢谢!

Printf 的打印效果与您手动输入的内容完全一样。除非您明确告诉它这样做,否则它不会返回到行首。所以当 printf 被要求打印 "\ta" 和 "\tb" 时,它首先输出

    a|
     ^- And leaves the "cursor" here...

所以当你要求它打印“\tb”时,它会从它停止的地方恢复,并打印:

    a    b

首先 printf() 不处理缓冲内存 directly.Suppose 它使用 fwrite() 函数调用(也使用系统调用 write())来写入任何内容任何文件和此函数处理缓冲区 memory.It 包含一个 pointer 到下一个写入最后一个字符的地方。 fwrite() 函数将数据写入特定文件。printf() 请求 fwrite() 将数据写入名为 stdout 的特定文件。

每次调用 printf() 函数时,它都会调用 fwrite() 函数将数据写入 stdout。 假设你想打印 "Hello World",你可以在一次调用 printf

时打印它
printf("Hello World\n");

printf("Hello ");
printf("World");
printf("\n");

所以你可以用 3 printf 来调用它,这将调用 fwrite() 3 次并且这个函数会记住要写入数据的位置 next.For 例如:- 在最后调用 printf("\n") 位置将设置为下一行。

你的问题是这个

printf("\t%d", i);
printf("\t\t%d", i * 2);
    // other printf elided for brevity

不等同于您要查找的内容。具体来说,您似乎 错误地 每次调用 printf() returns 光标到一行的开头(例如在终端上)。

实际上,printf() 的第二次调用会在第一次打印的整数值之后立即写入同一行。

输出是顺序的,所以

printf("\t%d", i);
printf("\t\t%d", i * 2);     // total of three \t in this and preceding statement

相当于(就完整数据输出而言)

printf("\t%d\t\t%d", i, i*2);    // note the 3 \t here.

不会

printf("\t%d\t%d", i, i*2);      //  only two \t here

此行为与缓冲无关。