澄清声明数组

时间:2015-05-25 06:43:12

标签: c kernighan-and-ritchie

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

1 个答案:

答案 0 :(得分:1)

忽略" 编程风格",这些函数没有任何东西可以运行它们(即一个main函数)。因此,您无法说明如何使用 ,但您可以了解 如何使用 。现在,假设在循环中调用ungetch,而根本不调用getch。在每次迭代中,bufp将增长1,buf将慢慢填充到bufp等于BUFSIZE且"太多字符& #34;将被打印。接下来,如果在循环中调用getch AFTER buf已满,bufp将在每次迭代时缩小1,直到buf为空并且getchar将用于下一个字符。