K&R C练习4-11,静态变量

3

我最近几个星期一直在阅读K&R书籍。我按顺序完成了所有内容,没有跳过太多。如果我卡在某些地方,通常可以通过谷歌示例找到答案,但这次,我被难住了。

第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 对此并不知情。
很抱歉这个简单的例子发了这么长的帖子。
1个回答

2
基本思路是,在您目前使用ungetch()的任何地方,您将其替换为设置静态变量的值,该值为您将要取消获取的值。然后,每次调用getch()时,如果它有效,则从静态变量中获取该值(您可能需要第二个静态变量来表示它是否有效,当您读取它时清除它,并在取消获取时设置它)。

谢谢你的帮助。我已经让它可以处理负数了,但是没有使用ungetch()函数就无法实现减法。不过我认为我已经理解了这个练习的大部分概念,所以我打算继续往下做了。我在这上面花费了太多时间了。再次感谢! - Austin Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接