Чтение отрицательных чисел с помощью getch () - PullRequest
1 голос
/ 30 марта 2011

Итак, я работаю над книгой по языку Си.И прорабатывает калькулятор вопросов.Он попросил добавить поддержку отрицательных чисел;что я и сделал, но обнаружил странное поведение, которое не могу объяснить.

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 Ответ

1 голос
/ 30 марта 2011
while(isdigit(s[++i] = c))
    c = getch();

и

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

имеют другое поведение. Последний читает один раз перед входом в цикл и проверяет, является ли считанное значение цифрой, а первый проверяет, было ли ранее прочитанное значение цифрой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...