用getch()读取负数

时间:2011-03-29 22:20:28

标签: c

所以我正在编写C编程语言书。并通过计算器问题。它要求增加对负数的支持;我做了但我发现了一个我无法解释的怪异行为。

int getop(char s[])
{
    int i = 0, c, next;
    /* Skip whitespace */
    while((s[0] = c = getch()) == ' ' || c == '\t')
        ;
    s[1] = '\0';    
    /* Not a number but may contain a unary minus. */
    if(!isdigit(c) && c != '.' && c != '-')
        return c;
    if(c == '-')
    {
        next = getch();
        if(!isdigit(next) && next != '.')
           return c;
        c = next;
    }
    else
        c = getch();    

    while(isdigit(s[++i] = c)) //HERE
            c = getch();
    if(c == '.')                     /* Collect fraction part. */
        while(isdigit(s[++i] = c = getch()))
                        ;
    s[i] = '\0';
    if(c != EOF)
        ungetch(c);
    return NUMBER;
}

适用于正数和负数

int getop(char s[])
{
    ...

    while(isdigit(s[++i] = c = getch())) //HERE
            ;
    if(c == '.')                     /* Collect fraction part. */
        while(isdigit(s[++i] = c = getch()))
                        ;
    s[i] = '\0';
    if(c != EOF)
        ungetch(c);
    return NUMBER;
}

仅适用于正数。

为什么!?

的getch()

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();
}

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

有不同的行为。后者在进入循环之前读取一次并检查读取的值是否为数字,而前者检查先前读取的值是否为数字。