2013-12-09 23 views
4
#include <stdio.h> 

void main() 
{ 
    printf("ab"); 
    printf("\bsi"); 
    printf("\rha"); 
} 

这个代码给出了“哈”的GCC 4.8编译器输出为什么以及如何显示涉及回车的以下输出?

#include <stdio.h> 

void main() 
{ 
    printf("ab"); 
    printf("\bsi"); 
    printf("\rha"); 
    printf("\n"); 
} 

这个代码给“辞海”对GCC 4.8编译器输出

现在的问题是为什么输出在添加语句printf(“\ n”)时从“ha”改为“hai”;最后(根据我)不应该由于前面的行而影响代码。

+0

有没有差异如果您在Ideone中进行比较,则输出结果:[sample1](http://ideone.com/YRHEgp),[sample2](http://ideone.com/exlshK)。这是特定终端/外壳实现的行为。 –

+0

好的,但我想知道它是如何不同于ideone的外壳。 – aroonav

回答

5

当程序结束时,shell会在光标最后一个位置开始写入提示。所以在第一种情况下,在\rha之后,光标位于i上。无论您的提示的第一个字符是什么,shell都会覆盖i

在第二种情况下,在末尾输出一个\n,将光标移动到shell写入其提示的下一行。

+0

我得到了第一个输出的原因,但在printf(“\ rha”)“hai”出现后的第二个输出中,光标位于第二个字符的末尾,准备写第三个字符......然后printf(“\ n”)会执行....所以应删除第三个字符'i'并将光标移动到下一行(给出输出“ha”),或者字符'i'保持不变,光标移到下一行((给出输出“海”))??看到输出,我猜它的前.. – aroonav

+0

@ sparx:是的,\ n'移动到下一行而不改变当前行的任何内容。所以,如果当你输出'\ n'时光标位于'i'上,'i'就会保持原位。 –

0

如果你编译的第一个代码,在我的地方,有光标,所以你不能看到我。在第二个代码中,光标位于新行中,并且不包含任何字符。所有的

2

首先你需要了解的空白字符:

  1. \ n ::这将光标移动到下一行。
  2. \ b ::它将光标移动到控制台左侧一个字符。只是简单地退后一个 字符。
  3. \ r :: Carrage Returns.It将光标移动到同一行的最右侧。

所以printf语句的结果是:: 1.打印“ab”,光标坐在行尾。 2.将光标移回一个空格(\ b)后,打印“asi”,光标坐在一行的末尾。 3.打印“海”,光标坐在哈,在我的下面。

因此,OUTPUT ::海

在第一种情况下,你都无法看到,因为游标而在第二,由于换行符你能看到它的“我”

相关问题