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