当我使用 printf()
编写一个小程序时,我注意到每个 \t
字符都用于以下 printf()
调用从上一个 printf()
调用中的字符串末尾继续。
下面的图片和代码示例将阐明我的意思。
预期输出示例
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/