【发布时间】:2017-04-04 14:27:34
【问题描述】:
我有下面的例子
#include <stdio.h>
#include<conio.h>
void main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
_getch();
}
首先,我不明白 printf 函数是如何工作的。我一直在努力寻找可以解释这一点的教程,但它们太基础了。
理解这一点的方式是有一个光标可以读取输入中的每个字符。例如,如果我们只有以下行:
printf("\bsi")
凭直觉,我认为它只是输出字符串 si,因为 si 之前没有先前的字符,但输出是 i。我还想补充一点,\b 考虑了另一个奇怪的 printf 的输入。
我还认为所有这些 printf 都相当于一个 printf。比如:
printf("\nab\bsi\rha");
这让我觉得酒吧后面发生了一些我无法真正解释或说出的事情。我认为这与输入上的某个指针有关,或者 printf 将输入存储在缓冲区中并以某种方式读取它。
有人能详细解释一下 printf 的工作原理吗?
....
这个问题有点不同,因为我知道这是同一个练习,但我对此有不同的看法并以不同的方式处理它。
【问题讨论】:
-
你看到了什么?
ab在\bsi之前输出——它们在同一行,因为您没有在第一个字符串之后输出换行符。我想你应该看到hai。是的,这三个等于一个。在你用 C 程序编程很长时间之前,直觉是一个非常糟糕的指标。 -
也许this 会有所帮助?
-
@Avi: 那么
\a是什么? -
@JonathanLeffler... 是的,我正在详细学习如何用 C 语言编程。很多新手绕过了很多我试图理解的东西。没有人回答我的任何问题 例如:如果没有要删除的先前字符,为什么 printf("\bsi") 返回 i 而不是 si。
-
最终,会发生什么取决于输出的显示方式——标准并没有说明,这是有充分理由的。然而,在大多数终端上,
\n输出一个换行符,将光标移动到新行的开头。写了a和b这两个字母;然后退格\b将光标向后移动一位,以便s覆盖b和i跟随。回车\r将光标移回行首;字母h覆盖a和a覆盖s,留下hai显示。你的“如果会发生什么”的问题不清楚——这取决于终端等。
标签: c