VisualC++中“F\T \b\bg\n”的意外结果 在Windows XP下,我在Visual C++ 6中编写了一行程序,但输出却让我困惑。有人能解释一下吗 #include "stdafx.h" int main(int argc, char* argv[]) { printf("f\t\b\bg\n"); return 0; }

VisualC++中“F\T \b\bg\n”的意外结果 在Windows XP下,我在Visual C++ 6中编写了一行程序,但输出却让我困惑。有人能解释一下吗 #include "stdafx.h" int main(int argc, char* argv[]) { printf("f\t\b\bg\n"); return 0; },c,visual-c++,printf,C,Visual C++,Printf,我得到的结果是: 按任意键继续 如果您在行开始之前将g\n写入过去,即索引-1?,则这是可能的,因此我猜您将跳过tab和f,而将g和换行符写入任何位置。在这种情况下,tab可能会插入0个空格。因此,我使用了一些不同的字符串,据我所知,Windows控制台遵循以下规则: 在常规字符之后,a\b将光标向左移动一个位置。这正是你所期望的。 a\t将光标向右移动n个位置后,a\b将光标向左移动n个位置。我不确定这是否是我所期望的,但这是有道理的。 a\b向左移动光标n个位置后,第二个\b将向左移动光标n

我得到的结果是:

按任意键继续


如果您在行开始之前将g\n写入过去,即索引-1?,则这是可能的,因此我猜您将跳过tab和f,而将g和换行符写入任何位置。在这种情况下,tab可能会插入0个空格。

因此,我使用了一些不同的字符串,据我所知,Windows控制台遵循以下规则:

在常规字符之后,a\b将光标向左移动一个位置。这正是你所期望的。 a\t将光标向右移动n个位置后,a\b将光标向左移动n个位置。我不确定这是否是我所期望的,但这是有道理的。 a\b向左移动光标n个位置后,第二个\b将向左移动光标n个位置。这显然不是有意的行为。我不太愿意使用术语bug,因为我不知道他们是否打算支持两个连续\b的情况,但这显然不是一个特性。 我不完全理解与新线的互动。可以说,在某些情况下,a\b能够移动到前一行,而在大多数情况下,a\b不能移动到前一行;同一printf语句中的\n前面的语句可以极大地影响\b与\t的交互,甚至可以说是在一定距离上。 因此,在您的示例f\t\b\bg\n中,f打印f并将光标向右移动一个位置;\t打印七个空格,并将光标向右移动七个位置到下一个制表位;第一个\b不打印任何内容,并将光标向左移动七个位置以撤消\t;第二个\b不打印任何内容,并将光标再向左移动七个位置,将光标放在前一行,我不骗你;g在前一行打印g,并假定将光标向右移动一个位置;然后\n将光标移回原始行

现在,你所观察到的和我所观察到的有两个小的区别。一个是我在前一行的末尾看到一个g,向右滚动:

$ gcc -Wall -Wextra tmp.c -o tmp.exe && ./tmp.exe
tmp.c: In function 'main':
tmp.c:3:14: warning: unused parameter 'argc' [-Wunused-parameter]
tmp.c:3:26: warning: unused parameter 'argv' [-Wunused-parameter]                                                g
f
而你显然没有;这是因为我从控制台运行了它,而您通过VisualStudio运行了它,所以您没有打印g的前一行。另一个是您观察到一个问题,即按任意键继续。紧接着f,这是Visual Studio表示console应用程序已结束的方式,而我观察到,如果我在字符串末尾添加了更多内容,例如,如果我的字符串是f\t\b\bg\nh\n,则会有更多内容覆盖了f。同样地,如果我钉上一个钉子;将h回显到Bash命令的末尾。也就是说,在我的测试中,\n将光标移动到原始行的开头,在您的测试中Visual Studio不知何故知道要打印,请按任意键继续。在线路上的f之后。但我不太在意这件事;我真的不知道VisualStudio是如何决定在何处按任意键继续打印的,很可能它使用了比光标位置更复杂或更复杂的东西

为完整起见,以下是一些字符串示例,我认为这些示例演示了上述结论:

printf                  console output
----------------------------------------------
"A\bB\n"                B
"A\b\bB\n"              B            [see note 1]
"AB\bC\n"               AC
"AB\b\bC\n"             CB
"AB\b\b\bC\n"           CB           [see note 1]
"A\t\bB\n"              AB
"A\t\t\b\bB\n"          B            [see note 2]
"A\tBB\t\b\bC\n"        A   C   BB   [see note 3]
注:

在这些情况下,多余的\b不会移到上一行。 第一个\t移动七个空格;第二个\t移动八;每个\b移动八个。所以B最终覆盖了A。 第二个T只移动六个空间,所以每个B移动六,C在A和BB的中间奇怪地结束。
您希望输出的是什么?@Als:应该有一个g在那里的某个地方。您是在cmd.exe中运行这个还是其他什么?如果有别的东西,你能直接从CMDE EXE试试吗?为什么你使用Visual C++ 6?@ Beoviigt:我没有说有。在2012年使用VC++6仍然很荒谬,而且这会给后续的操作带来很多痛苦。类似的情况似乎确实如此。在VS2010 printfXXXf\t\b\bg\n下;给我gXXf。谢谢你令人信服的解释。这对我帮助很大: