1 Востаннє редагувалося Ярослав (07.01.2013 12:15:53)

Тема: K&R exercise 5.1

Вітаю всіх!

Завдання до вправи звучить так:

As written, getint treats a + or - not followed by a digit as a valid representation of zero. Fix it to push such a character back on the input.

Функція getint розуміє + або -, після якого нема цифри, як дійсне представлення нуля...

Що значить ця фраза, чому + або -, після якого нема цифри буде розумітись саме як дійсне представлення нуля

#include <stdio.h>
#include <ctype.h> /* isspace() */ 
#define SIZE 1024

int getint(int *);
int getch(void);
void ungetch(int);

int main(void){
    int n, array[SIZE];
    for (n=0; n<SIZE && getint(&array[n])!=EOF; n++)
        {printf("%d", n);}
    return 0;
}

int getint(int *pn){
    int c, sign;

    while(isspace(c = getch()))
        ;
    if(isdigit(c) && c!=EOF && c!='+' && c!='-'){
        ungetch(c); // not a number
        return 0;
    }
    sign = (c == '-') ? -1 : 1;
    if(c == '+' || c == '-')
        c=getch();
    for(*pn=0; isdigit(c); c = getch())
        *pn = 10 * *pn + (c - '0');
    *pn *= sign;
    if(c!=EOF)
        ungetch(c);
    return(c);
}

#define BUFSIZE 100

char buf[BUFSIZE];
int bufp = 0;

int getch(void){
    return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch(int c){
    if(bufp > BUFSIZE)
        printf("Too much symbols");
    else
        buf[bufp++] = c;
}

2

Re: K&R exercise 5.1

У функції getint() робиться отримання числа з клавіатури посимвольно. Рухаючись кодом, можна побачити, що коли користувач одразу після знаку "+" чи "-" введе нечислове значення або взагалі Enter, цикл із умовою isdigit(c) фізично не виконається, проте присвоєння *pn=0 виконається як ініціалізація. Таким чином, результуюча змінна міститиме після циклу значення 0.