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
将用于下一个字符。