1. ホーム
  2. c

[解決済み] K&RにあるC言語のgetint()の動作が理解できない。

2022-01-29 07:50:14

質問

2日前からこのコードの動作を理解しようとしているのですが、どうしても理解することができません。

私の疑問は、この関数の動作についてです。mainがないとか、そういうことは考慮しないでください。

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

  1. bufp=0とすると、この関数はgetch()を呼び出すので、c=aということになります。(単なるランダムな文字)
  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;
}

解決方法は?

getint()関数は、入力から数字だけを読み取ります。もし数字でない文字や先頭に+-記号があると、ungetch()を呼んでその文字を入力バッファに戻し、他の関数呼び出しで読み込めるようにします。