2013-01-08 70 views
4

ķ& RC 1-10讀取:K&R 1-10,終端吃退格

「寫一個程序,它的輸入複製到它的輸出,由\噸替換每個選項卡,每個退格由\ B,並且每個反斜槓都是\,這使得製表符和退格符以明確的方式可見。「

我有下面的代碼,它不適用於退格字符,因爲終端吃了字符。到目前爲止,本書所涵蓋的內容似乎沒有解決方案。解決方案是什麼?

#include <stdio.h> 

main() 
{ 
    int c; 

    while((c = getchar()) != EOF) { 

     switch (c) { 
      case '\t': 
       printf("\\t"); 
       break; 
      case '\b': 
       printf("\\b"); 
       break; 
      case '\\': 
       printf("\\\\"); 
       break; 
      default: 
       putchar(c); 
     } 
    } 
} 
+5

輸入重定向到救援:'yourprogram fvu

+3

在現代類Unix系統上,您可以使用control-V control-H(或control-V backspace)在終端輸入退格。 K&R書沒有足夠詳細地提及Unix環境的細節來提及這類問題 - 也不應該這樣做。 –

+0

哪個操作系統?我有與macOS相同的問題,但'ctrl + h'進入退格。 FWIW,這裏是[練習1-10的解決方案](https://github.com/mixelpixel/The-C-Programming-Language/blob/master/ch1/1.5.3_ex1-10.c),只寫入術語在K&R的C書中用到了這一點。 –

回答

3

這裏沒有錯。如果您要在包含退格字符的文件上運行該程序,它會正確轉換它。對於終端輸入,程序將不會收到退格,因爲它由輸入例程管理。

3

這是因爲操作系統正在處理終端IO,並在程序開始查看它們之前處理鍵盤上的字符。

如果你是一個Unix/Linux系統上,你可以換你的程序是這樣執行:

$ stty -icanon -echo; ./a.out; stty icanon echo 

這將在一些特定的方式來處理輸入禁用終端驅動程序:ICANON啓用處理諸如退格處理之類的東西,而echo會導致您輸入的字符被打印。由於您的程序本身回顯了字符,因此可以關閉回顯。與此唯一的問題是-icanon也停止EOF處理,所以你需要添加額外的條件走出循環:

#include <stdio.h> 

#define CTRL(x) (x & 0x1f) 

main() 
{ 
    int c; 

    while((c = getchar()) != EOF && c != CTRL('d')) { 
... 

這也是一個不錯的主意,而這樣的測試程序運行他們在一個單獨的窗口中,所以如果最終進入奇怪的終端模式,您可以快速輕鬆地殺死整個會話!