繁体   English   中英

《 The C Programming Book》中的getop()函数如何工作?

[英]How does the function getop() from “The C Programming Book” work?

int getop(char *s) {
    int i, c;

    while((s[0] = c = getch()) == ' ' || c == '\t')
           ;

    s[1] = '\0';

    if(!isdigit(c) && c != '.') {
        return c;
    }

    i = 0;
    if(isdigit(c))
        while(isdigit(s[++i] = c = getch()))
                ;

    if(c == '.')
        while(isdigit(s[++i] = c = getch()))
                ;

    s[i] = '\0';

    if(!isdigit(c))
        ungetch(c);

    return NUMBER;

}

我在研究一个名为“反向抛光计算器”的示例时遇到了这种功能。 我们可以通过此功能输入用于计算器操作的数字,但我无法使用此功能。 喜欢。,

如果我们输入-----

12.34 11.34 +

while((s[0] = c = getch()) == ' ' || c == '\t')
    ;
s[1] = '\0';

s将包含1。但是其余输入从何处进入s?

我已经很好地完成了此功能,然后才知道它正在工作,但随后我想了解深度工作,就像完整的流程一样。 高度重视任何帮助。

编辑:-在测试了各种输入之后,我得出的结论是,对getch()和ungetch()的需求是什么,是的,是的,它们在那里是未读不需要的字符,而不是查看测试用例。

  int getop(char *s) {
    int i, c;

    while((s[0] = c = getchar()) == ' ' || c == '\t')
        ;

    s[1] = '\0';

    if(!isdigit(c) && c != '.') {
        return c;
    }

    i = 0;
    if(isdigit(c))
        while(isdigit(s[++i] = c = getchar()))
                ;

    if(c == '.')
        while(isdigit(s[++i] = c = getchar()))
                ;

    s[i] = '\0';

   /* if(!isdigit(c))
        ungetch(c);*/

    return NUMBER;


}

在这里,我用getchar()替换了getch(),它仍然接受了输入

12a 12 -

并且输出绝对正确,并且也未读“ a”字符

144

当我使用getch()时也是如此?

让我们将其细分:

  • while((s[0] = c = getch()) == ' ' || c == '\\t')从字符串的开头跳过所有空格和制表。 在此循环s[0]末尾, s[0]包含第一个字符,该字符不是前面提到的两个字符之一。

现在,如果c不是. 或一个数字,我们只是将其返回。

   if(!isdigit(c) && c != '.') {
        return c;
    }

如果c不是数字,那么我们就完成了,将s[1]设置为null是完全正确的!

否则,如果c是一个数字,我们将读取尽可能多的数字字符,因为我们可以从位置1覆盖s s [1]为'\\ 0',但这并不重要,因为s [++ i]在第一次迭代时为s [1]

 i = 0;
    if(isdigit(c))
        while(isdigit(s[++i] = c = getch()))

因此s保持一致状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM