2017-07-05 7 views
4

私はK & Rの第1章の練習の一部として次のコードを書きました。コードはタブとバックスラッシュを予想通りに置き換えますが、バックスペースを\ bに置き換えません。コードは次のとおりです。シェルと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; 
} 

私はStack Overflowを調べました。 this質問への回答は、シェルがバックスペースを消費していることを示しています。その結果、書き込むコードにはバックスペースが見えません。これは私の質問に私をもたらします:私がキーボードで提供する入力はどうなりますか?私はこれが標準ストリームの一部になると仮定します。明らかに、しかし、私が入力するすべての文字を自分のコードにするわけではありません。誰かが私のキーストロークとそのコードの入力を処理する間に何が起こるか説明してください。また、この処理が発生する前に私のコードがstdinバッファを読み取る方法はありますか?

これらの質問が意味をなさないことを願います。私が尋ねようとしていることを理解するまでにはしばらく時間がかかりました。私はそれを完全に理解したとは確信していません。

+1

あなたが研究する関連トピックは、*端末*(エミュレータ)と考えています。 – EOF

+0

入力/出力をファイルにリダイレクトしようとしましたか?それは動作しましたか? – Olaf

+1

私はあなたが興味深い最初の答えを見つけるだろうと思うhttps://stackoverflow.com/questions/1798511/how-to-avoid-press-enter-with-any-getchar –

答えて

3

getchar()が対話型コンソールから読み取っている場合、の後には、Enterキーを押した後、関数はまで戻りません。その後、最初の文字が入力された状態で戻り、改行文字まで入力した後続の文字ごとにすぐに戻ります。

Enterキーを押す前にバックスペース、削除、または矢印キーを押した場合、ターミナルはこれらのキーストロークを処理し、Enterキーを押したときにのみ「最終結果」を送信します。

あなたがリダイレクトさ-にファイルからの読み取りされて(つまり、あなたが./myprog < input_fileとしてあなたのプログラムと呼ばれる)、または別のプログラム(すなわち./otherprog | ./myprog)からのパイプライン出力、そしてgetcharは、各文字のためにすぐに戻ってくると、あなたはすべてのものを見ることになる、などの持っていました制御文字と個々のUTF-8バイト。

1

これは、標準入力でバックスペース文字が決してgetcharに届かないためです。バックスペースを入力すると、ちょうど入力した文字がキャンセルされます。

テキストファイルをバックスペース文字で作成し、それをあなたのプログラムに送ってもうまくいく場合は、

関連する問題