2017-07-05 83 views
4

作爲K & R的第一章練習的一部分,我編寫了以下代碼。代碼按預期替換製表符和反斜槓,但不會用\ b替換後退。這裏是代碼:shell和C程序之間的關係

#include <stdio.h> 


int main(void) 
{ 
    int c; 

    while((c = getchar()) != EOF) 
    { 
     if (c == '\t') 
     { 
      putchar('\\'); 
      putchar('t'); 
     } 

     if (c == '\b') 
     { 
      //putchar('\\'); 
      //putchar('b'); 
      printf("\\b"); 
     } 

     if (c == '\\') 
     { 
      putchar('\\'); 
      putchar('\\'); 
     } 

     if (c != '\t' && c != '\b' && c != '\\') 
     { 
      putchar(c); 
     } 
    } 


    return 0; 
} 

我已經看了通過堆棧溢出。 this問題的答案是關於shell使用退格的結果,因爲我寫的代碼從來沒有看到退格。這使我想到了我的問題:我在鍵盤上輸入的內容會發生什麼?我認爲這成爲stdin流的一部分。顯然,並非所有輸入的字符都會將其添加到我的代碼中。有人能解釋我的鍵盤輸入和我的代碼處理輸入之間發生了什麼處理嗎?另外,有沒有辦法讓我的代碼在進行此處理之前讀取stdin緩衝區?

我希望這些問題有意義。我花了一段時間才弄清楚我想要問什麼,我不確定我是否完全明白了這一點。

+1

我相信你研究的相關話題是*終端*(模擬器)。 – EOF

+0

您是否嘗試將輸入/輸出重定向到文件?它有用嗎? – Olaf

+1

我想你會發現第一個答案有趣https://stackoverflow.com/questions/1798511/how-to-avoid-press-enter-with-any-getchar –

回答

3

getchar()正在從交互式控制檯讀取時,功能將不會返回,直到您按ENTER鍵。然後它將返回輸入的第一個字符,並立即返回您輸入到換行符後的每個後續字符。

如果您在按下回車鍵之前按下退格鍵,刪除鍵或箭頭鍵,則終端將處理這些鍵擊操作,並且只有在按ENTER鍵時纔會發送「最終結果」。

如果你過去從重定向-文件(比如,你叫你的程序作爲./myprog < input_file)或管道輸出讀取從另一個程序(即./otherprog | ./myprog),然後getchar將立即返回每個字符,你會看到的一切,包括控制字符和單個UTF-8字節。

1

這是因爲在標準輸入中,退格字符永遠不會到達getchar。當你鍵入退格時,它只是取消你剛輸入的字符。

但是,如果您設法使用退格字符創建文本文件並將其提供給可以工作的程序。