“C编程手册”中的函数getop()如何工作?

时间:2017-07-11 16:35:21

标签: c

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';

将包含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()时的情况如此?

1 个答案:

答案 0 :(得分:0)

让我们一块一块地分解:

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

现在,如果c不是.或数字,我们只需返回该数字。

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

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

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

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

因此s保持一致状态。