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

标签 c printf c-strings

当我使用 printf() 编写一个小程序时,我注意到每个 \t 字符都用于以下 printf()调用从上一个 printf() 调用中的字符串末尾继续。

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

预期输出示例

screenshot of tabular output

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("\t%d", i);
printf("\t\t%d", i * 2);
    // other printf elided for brevity

不等同于您正在寻找的内容。具体来说,您似乎错误地认为每次调用 printf() 都会将光标返回到一行的开头(例如在终端上)。

实际上,第二次调用 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

此行为与缓冲无关。

关于c - 每次调用 printf() 是否创建一个新的内部缓冲区,或者所有后续调用都使用与第一个相同的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48736868/

相关文章:

C : Process keeps exiting before being able to input anything

c - 为什么我自己的 suid-ed 程序仍然保留原来的 uid?

c - 在c中以恒定时间从数组中删除3D点

我们可以使用 realloc 释放动态分配的内存吗?

c - 使用 sprintf 打印 size_t 需要多少个字符?

c - 如何从 C 文件中的双引号中读取多个单词

ios - 如何在 ios 中定义多个 c 标志?

PHP MySQL 语句 - "select as"和 "where"

c - 文件已打开但未写入

c++ - 使用括号括起来的初始化器分配字符串时出错