2011-12-14 22 views
5

このコードはK & Rです。私はそれを何度も読んでいますが、それでも私の把握から脱出するようです。この例を説明してくださいCコード

#define BUFSIZE 100 

char buf[BUFSIZE]; 
int bufp = 0; 

int getch(void) 
{ 
     return(bufp>0)?buf[--bufp]:getchar(); 
} 

int ungetch(int c) 
{ 
     if(bufp>=BUFSIZE) 
      printf("too many characters"); 
     else buf[bufp++]=c; 
} 

これら2つの関数の目的は、そのK & Rが言う、あまりにも多くの入力を読んでからプログラムを防ぐためです。すなわち、このコードがなければ、関数は最初にあまり読み過ぎないと十分なデータを読み取ったと判断できないことがあります。しかし、私はそれがどのように機能するのか分かりません。

たとえば、getch()を考えてみましょう。 【 - bufpに】それではBUF用のchar値を返す場合bufpには0

  • より大きい場合

    1. チェック: は、私の知る限り、これを見ることができるようにそれが取る工程です。
    2. else getchar()を返します。

    私は具体的な質問をしたいと思っていますが、私は文字通りこのコードがどのように達成しようとしているのかを知っていません。このコードの?

    ありがとうございます。

    注:任意のK & Rファンのために、このコードは79ページで見つけることができます(あなたのエディションによって、私は考えます)

  • +0

    'ungetch'の内部のテストでは、おそらく' bufp'が 'printf'の条件に含まれるべきです。私はそれがタイプミスだと思う。 –

    +0

    私はK&Rを手にしていませんが、ungetchではif条件が 'bufp> = BUFSIZE'であるべきだと思います。 – kol

    +0

    申し訳ありません、おそらく私の間違いです。 SOmeoneは今修正しているので、私が入力したものを覚えていない。 –

    答えて

    9

    (a)は、このコードの目的は、文字を読むことができるようにすることですあなたが誤って多くの文字を読んでいることが判明した場合は、「un-read」してください(最大で100文字を "un-read"にしてください)。先読みのあるパーサーで便利です。

    (b)getchbufの内容は、bufp>0と表示されます。 bufが空の場合は、getcharを呼び出します。これは、bufをスタックとして使用することに注意してください。右から左に読み込みます。

    ungetchは、スタックが満杯でないかどうかを確認した後で、文字をスタックbufにプッシュします。

    +0

    しかし、ungetch isntが呼ばれたと仮定すると、getchは常にgetchar()を返します。これは、bufpが無限にゼロになるためです。私はこの部分を理解していない。 –

    +0

    @JJG:そうです、あなたが決して 'ungetch'を呼び出さなければ、バッファは必要なくなり、' getchar'から常に新しい入力を得るでしょう。 –

    1

    コードを使用すると、文字を元に戻すすでにを読むことができるので、代わりにそれは、「あまりにも多くの入力を読み込む」を実際にはありません。

    たとえば、ある文字をgetchと読み、それが文字かどうかを確認して、ungetchと戻して、すべての文字をループ内に読み込みます。これは、次のキャラクターが何であるかを予測する方法です。

    1

    このコードブロックは、ストリームから読み取った内容に基づいて意思決定を行うプログラムで使用するためのものです。時には、そのようなプログラムは実際に入力を消費することなくストリームから数文字を見る必要があります。たとえば、入力がabcde12xy789の場合、abcde12xy789に分割する必要があります(つまり、連続する数字のグループから連続した文字のグループを区切って)、文字のグループの末尾に達していることがわかりません数字が表示されるまでしかし、あなたはそれを見るときにその数字を消費したくない:あなたが必要なのは、文字のグループが終了していることを知ることです。その数字を「戻す」方法が必要です。ungetchはこの状況で便利です。文字のグループの後に数字が表示されたら、ungetchを呼び出して数字を戻します。次の反復では、同じ数字のgetchメカニズムを使用してその数字が選択されます。これは、読んだが消費しなかった文字を保存する必要がないことを意味します。

    0
      1.ここに示したもう1つのアイデアは、非常に基本的なI/Oスタック管理システムとも呼ばれ、getch()関数とungetch()関数の実装を示しています。
      2.オペレーティングシステムを設計する場合、すべてのキーストロークを格納するメモリをどのように処理できますか?

    これは上記のコードスニペットで解決されています。この概念の拡張子はファイル処理、特にファイルの編集で使用されます。この場合、標準入力からの入力を取得するgetchar()ファイルは入力のソースとして使用されます。