2013-12-09 25 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 ::海

在第一種情況下,你都無法看到,因爲遊標而在第二,由於換行符你能看到它的「我」

相關問題