5

このコードは K&R からのものです。何度も読んでいますが、まだ理解できていないようです。

#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;
}

K&R によると、これら 2 つの関数の目的は、プログラムが大量の入力を読み取らないようにすることです。つまり、このコードがないと、関数は、最初に読みすぎない限り、十分なデータを読み込んだかどうかを判断できない可能性があります。しかし、私はそれがどのように機能するのか理解していません。

たとえば、getch() について考えてみましょう。私が見る限り、これはそれが取るステップです:

  1. bufp が 0 より大きいかどうかを確認します。
  2. その場合、buf[--bufp] の char 値を返します。
  3. それ以外の場合は getchar() を返します。

より具体的な質問をしたいのですが、このコードが意図したことをどのように達成するのか文字通りわからないので、私の質問は次のとおりです:(a)目的と(b)このコードの理由は何ですか?

前もって感謝します。

注: K&R ファンの場合、このコードは 79 ページにあります (エディションによって異なります)。

4

5 に答える 5

9

(a) このコードの目的は、誤って文字を読みすぎたことが判明した場合に、文字を読み取ってから「読み取らない」ことができるようにすることです (最大100で「読み取れない」文字数) 。 . これは、先読みのあるパーサーで役立ちます。

(b)で示されるコンテンツがある場合は、getchから読み取ります。が空の場合、 を呼び出します。スタックとして使用することに注意してください。右から左に読み取ります。bufbufp>0bufgetcharbuf

ungetchbufスタックがいっぱいでないかどうかを確認した後、文字をスタックにプッシュします。

于 2011-12-14T14:04:39.243 に答える
1

このコードは、実際には「あまりにも多くの入力を読み取る」ためのものではなく、すでに読み取った文字を元に戻すことができるようにするためのものです。

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

于 2011-12-14T14:07:40.590 に答える
1

このコード ブロックは、ストリームから読み取った内容に基づいて決定を行うプログラムで使用することを目的としています。そのようなプログラムは、実際に入力を消費することなく、ストリームからいくつかの文字を調べる必要がある場合があります。たとえば、入力が次のようになり、それを, , , にabcde12xy789分割する必要がある場合(つまり、連続する文字のグループを連続する数字のグループから分離する)、数字が表示されるまで、文字のグループの終わりに達したことを認識できません。 . ただし、その数字を見た時点でその数字を消費したくはありません。必要なのは、文字のグループが終了していることを知ることだけです。その数字を「元に戻す」方法が必要です。anはこのような状況で役立ちます: 文字のグループの後に数字が表示されたら、 を呼び出して数字を元に戻します。abcde12xy789ungetchungetch. 次の反復では、同じgetchメカニズムを介してその数字が再び選択されるため、読み取ったが消費しなかった文字を保持する必要がなくなります。

于 2011-12-14T14:17:33.003 に答える
0
    1. ここに示したもう 1 つのアイデアは、非常に原始的な I/O スタック管理システムと呼ぶこともでき、関数 getch() および ungetch() の実装を提供します。
    2. さらに一歩進んで、オペレーティング システムを設計したいとします。すべてのキーストロークを保存するメモリをどのように処理しますか?

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

于 2011-12-14T14:25:37.720 に答える