由于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;
}
答案 0 :(得分:4)
在讨论getop()
之后的几个段落中,本书对ungetch()
实施(强调添加)提出了这样的说法:
标准库包含一个函数
ungetch
,它提供一个后推字符;我们将在第7章讨论它。我们使用了一个数组用于推回,而不是单个字符,以说明更通用的方法。
答案 1 :(得分:0)
BUFSIZE
是唯一函数来调用getop()
,则 ungetch()
可以为1。
根据这篇文章,更高级别的代码可能会在调用ungetch()
之前多次调用getop()
,从而将多个char
填入buf
。