5

私はこのコードの動作を 2 日間理解しようとしましたが、頭を包むことができません。

私の疑問は、機能の働きについてです。main やその他のものがないことを考慮しないでください。

私が理解できないのは、getint() が getchar() で入力を受け取ると、次のようになるということです。

  1. bufp=0 としましょう。この関数は、c=a を意味する getch() を呼び出します。(ただのランダムキャラ)
  2. ungetch(a) を使用した次のステップ。これは、buf[0]=a および bufp=1 を意味します。
  3. 今は手に入らないところです。次に getint() が呼び出されると、結果として c=buf[--bufp]=a と bufp=0 になります。
  4. これにより、再び ungetch(a) が実行され、関数がどこにも導かれなくなります。

ここでいくつかの主要な概念が間違っているかどうかはわかりませんが、それを理解することはできません. :(

/* getint:  get next integer from input into *pn */

int getint(int *pn)
{
    int c, sign;

    while (isspace(c = getch()))   /* skip white space */
            ;

    if (!isdigit(c) && c != EOF && c != '+' && c != '-') {
            ungetch(c);  /* it is not a number */
            return 0;
    }
    sign = (c == '-') ? -1 : 1;
    if (c == '+' || c == '-')
            c = getch();
    for (*pn = 0; isdigit(c); c = getch())
            *pn = 10 * *pn + (c - '0');
    *pn *= sign;
    if (c != EOF)
            ungetch(c);
    return c;
}

#define BUFSIZE 100

char buf[BUFSIZE];      /* buffer for ungetch */
int bufp = 0;           /* next free position in buf */

int getch(void) /* get a (possibly pushed-back) character */
{
   return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch(int c)     /* push character back on input */
{
   if(bufp >= BUFSIZE)
      printf(" ungetch too many characters\n");

   else
      buf[bufp++] = c;
}
4

4 に答える 4

5

getint() 関数は、入力から数字のみを読み取ります。先頭に数字でも + - 記号でもない文字を取得すると、ungetch() を呼び出してその文字を入力バッファにプッシュし、他の関数呼び出しで読み取ることができるようにします。getint() は、自分で getch() を呼び出して入力バッファから数字以外の文字を削除するまで、0 を返し続けます。

于 2012-04-16T08:40:39.447 に答える
1

失敗した場合getint()(したがって、指定したシナリオでungetchを使用した場合)、再度呼び出すと再びgetint()失敗します。保留中の文字を消費し、intとして解釈できないデータから何か有用なものを作成する別の関数を呼び出すことが期待されています。

于 2012-04-16T12:34:25.253 に答える
1

関数名を混乱させているのは私には理にかなっています

getch != getchar getint != getop

少し寝る

于 2012-04-16T08:09:59.763 に答える
0

関数は、ソース ファイル内の順序ではなく、呼び出された順序で実行されます。

も存在main(){...}しないため、コードは現在の状態では何もしません。

于 2012-04-16T08:09:13.787 に答える