5

我已经尝试理解这段代码的工作两天了,但就是无法理解它。

我的疑问是关于该功能的工作。请不要考虑缺少 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;
}
4

4 回答 4

5

getint() 函数仅从输入中读取数字。如果它在开始时得到一个不是数字或 + - 符号的字符,它将调用 ungetch() 将字符推回输入缓冲区,以便它可以被其他函数调用读取。getint() 将继续返回 0,直到您通过自己调用 getch() 从输入缓冲区中删除非数字字符。

于 2012-04-16T08:40:39.447 回答
1

对我来说,你混淆了你的函数名称是有道理的

getch != getchar getint != getop

睡一会儿

于 2012-04-16T08:09:59.763 回答
1

如果getint()失败(因此在您给出的场景中使用 ungetch),再次调用getint()将再次失败。您应该调用另一个函数,该函数将消耗待处理的字符并从无法解释为 int 的数据中产生有用的东西。

于 2012-04-16T12:34:25.253 回答
0

函数将按照它们被调用的顺序执行,而不是它们在源文件中的顺序。

也没有main(){...},因此代码在当前状态下不会做任何事情。

于 2012-04-16T08:09:13.787 回答