int getch(void);
void ungetch(int);
/* getop: get next character or numeric operand */
int getop(char s[])
{
  int i, c;
  while ((s[0] = c = getch()) == ' ' || c == '\t')
    ;
  s[1] = '\0';
  if (!isdigit(c) && c != '.')
    return c; /* not a number */
  i = 0;
  if (isdigit(c)) /* collect integer part */
  while (isdigit(s[++i] = c = getch()))
    ;
  if (c == '.') /* collect fraction part */
    while (isdigit(s[++i] = c = getch()))
      ;
  s[i] = '\0';
  if (c != EOF)
    ungetch(c);
  return NUMBER;
}

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

以上代码来自K&R。
在上面的代码中,我看到数组buf[]用于索引1的最大值,但是它被定义为100的大小。定义是否正确,或者内存中存在大量浪费?
我几乎认为这是一种糟糕的编程风格。
我只要求getop()func,而不是一般的getch()和ungetch()
我是初学者,如果我的问题无效,我很抱歉:P

最佳答案

不考虑“编程风格”,这些函数没有任何东西可以运行(即amain函数)因此,你不知道这些将如何使用,但你可以理解如何使用它们现在,假设在循环中调用ungetch,而根本不调用getch在每次迭代中,bufp将增长1,buf将缓慢填充到bufp等于BUFSIZE的点,并且将打印“过多字符”接下来,如果在循环中在getch已满之后调用buf,则每次迭代的bufp将缩小1,直到buf为空并且getchar将用于下一个字符。

08-16 13:17