2015-11-08 99 views
0

示例代碼是(註釋是什麼我想它做的第一循環):爲什麼backspace在C中撤消一個單獨的getchar()調用?

#include <stdio.h> 

#define BACKSPACE 8 

main() 
{ 
    int c; 


    while((c = getchar()) != EOF)  //output: GODDAMN NOTHING cursor on: 'h' 
    { 
     //if the input is "house" before entering EOF 
     putchar(c);     //output: 'h' cursor on: 'o' 

     getchar();     //output: 'h' cursor on: 'u' 
     printf("%c", BACKSPACE);  //output: 'h' cursor on: 'o' 
     getchar();     //output: 'h' cursor on: 'u' 
     printf("%c", BACKSPACE);  //output: 'h' cursor on: 'o' 
     getchar();     //output: 'h' cursor on: 'u' 
     printf("%c", BACKSPACE);  //output: 'h' cursor on: 'o' 
    } 
}  //ACTUAL END OUTPUT: "h" 

我知道在大多數程序定期退格的樣子: 的printf(「%C%C」,8,8) ; ..意味着backspace幾乎只是將光標移回而不刪除任何東西,就像getchar()如何將光標向前移動一樣。

我試圖理解爲什麼上面的示例代碼的輸出是不完全一樣的:

#include <stdio.h> 

main() 
{ 
    int c; 


    while((c = getchar()) != EOF)  //output: WE HAVE NOTHING cursor on: 'h' 
    { 
     //if the input is "house" before entering EOF 
     putchar(c);   //output: 'h' cursor on: 'o' 
    } 
}  //ACTUAL END OUTPUT: "house" 

編輯:跟進的問題!如何「反向」調用getchar()?

#include <stdio.h> 

main() 
{ 
    int c; 
    char a; 


    while((c = getchar()) != EOF) 
    { 
     a = c; 
     putchar(c); 

     a = getchar(); 
     ?????????? 
    } 
} 

什麼我不得不穿上「____」,所以,當我的getchar再次調用分配給C,它前面分配到c後得到的焦炭,而不是之後的字符。

回答

2

你的程序實際上並不是每次從終端讀取一個字符。相反,它是從緩衝區中讀取的,該緩衝區保存了您輸入的整個行。

所以:

  • 閱讀h,你的程序
    • 打印h
    • 從緩衝區中讀取o
    • 發送退格(把光標放在h)後
  • 然後它讀取u,和
    • 發送一個退格(試圖左邊距之前移動光標),
  • 然後它讀取s,和
    • 發送另一個退格
  • 完成循環並輸入更多字符

某些終端會將光標折回到上一行的末尾,有些終端會在空白處停止。

2

您的輸出實際上並不會輸入您輸入的相同位置。

終端收集您的按鍵。當你鍵入時,顯示它們並記住它們。當你按下ENTER鍵時,它會將它記住的鍵擊發送給你的程序。

同時,它顯示程序的輸出。您可以讓終端清除您鍵入的字符的顯示,但這不會改變您輸入的字符的內存,也不會更改發送到您的程序的字符。

撤消的getchar(),您可以使用ungetc函數:

http://www.cplusplus.com/reference/cstdio/ungetc/

相關問題