所以过去几周我一直在阅读K& R书。我按顺序完成了所有操作,并没有真正跳过太多。如果我遇到困难,我通常可以通过google示例找到答案,但这一次,我一直难倒。
4.6节涉及在外部和内部声明静态变量。练习说:
练习4-11。修改getop,使其不需要使用ungetch。提示:使用内部静态变量。
这与波兰计算器有关。 getop收集下一个运算符或操作数,ungetch将一个字符推回到输入堆栈。
原始函数如下所示:
int getop(char s[])
{
int i, c;
while ((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if (!isdigit(c) && c != '.' && c != '-' )
return c; /* not a number */
i = 0;
if (c == '-') {
if (isdigit(c = getchar())) {
s[i] = '-';
ungetch(c);
}
else {
ungetch(c);
return '-';
}
}
if (isdigit(c)) /* collect integer part */
while (isdigit(s[++i] = c = getch()))
;
if (c == '.') /* collect a fraction part */
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c != EOF)
ungetch(c);
return NUMBER;
}
我查找的大多数示例都是这样的:
static int buf = EOF;
if (buf != EOF && buf != ' ' && buf != '\t'
&& !isdigit(buf) && buf != '.') {
c = buf;
buf = EOF;
return c;
}
if (buf == EOF || buf == ' ' || buf == '\t')
while ((*s = c = getch()) == ' ' || c == '\t')
;
else
*s = c = buf;
buf = EOF;
我的问题是没有考虑我们之前应该对getop进行的修改,即处理负数。我发现的所有例子似乎都没有使用变量是静态的事实,因此在调用函数后保持不变。我们最后将它设置为EOF。如果函数调用之间的变量无关紧要,为什么要使用静态变量?
最后,我不确定如何使用静态变量将c粘贴到输入堆栈上。 getch使用getch和ungetch之间的共享数组,getop不知道。
对于这样一个简单示例的较长帖子感到抱歉。
答案 0 :(得分:2)
基本的想法是getop
中您目前拥有ungetch()
的任何地方,而是将静态变量设置为您未获得的值。然后,在你调用getch()
的任何地方,如果它是有效的,你将从静态变量中获取值(你可能需要第二个静态变量来说明它是否有效,你在阅读它时清除它,并设置何时你没有进入它。)