K& R反向抛光计算器中buf阵列的目的是什么

时间:2014-01-03 16:28:59

标签: c arrays char kernighan-and-ritchie

由于getop的实现,buf数组永远不会有多个元素。那么,它不能被声明为普通的char变量吗?

这是该计划的源代码,第74-79页:

#include <ctype.h>

int getch(void);
void ungetch(int);

/* getop: get next character or numeric operand */
int getop(char s[]) /* we pass s[] to getop to store input */
{
    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;
/* getch: the function which actually gets chars! */
int getch(void) /* get a (possibly pushed-back) character */
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch(int c) /* push character back in input */
{
    if (bufp >= BUFSIZE)
        printf("ungetch: too many characters\n");
    else
        buf[bufp++] = c;
}

2 个答案:

答案 0 :(得分:4)

在讨论getop()之后的几个段落中,本书对ungetch()实施(强调添加)提出了这样的说法:

  

标准库包含一个函数ungetch,它提供一个后推字符;我们将在第7章讨论它。我们使用了一个数组用于推回,而不是单个字符,以说明更通用的方法。

答案 1 :(得分:0)

如果BUFSIZE唯一函数来调用getop(),则

ungetch()可以为1。

根据这篇文章,更高级别的代码可能会在调用ungetch()之前多次调用getop(),从而将多个char填入buf