Понимание getint () K & R (Глава 5: Указатели и массивы, Упражнение 1)? - PullRequest
0 голосов
/ 18 мая 2018

Я начинающий программист, который самостоятельно изучает C через K & R.Я не понимаю дизайн их функции getint (), которая преобразует строку цифр в целое число, которое она представляет.Я задам свой вопрос, а затем отправлю код ниже.

Если getch () возвращает нецифровый символ, который не является '-' или '+', он выталкивает этот нецифровый символ обратно на вход с помощью ungetch () и возвращает 0. Итак, еслиgetint () вызывается снова, getch () просто возвращает тот же нецифровый символ, который был перенесен назад, поэтому ungetch () отодвинет его снова и т. д. Насколько я понимаю (что может быть неправильно), функцияломается полностью, если передается любой нецифровый символ.

В упражнении вы не исправите это.Он просит исправить тот факт, что '-' или '+', за которым следует нецифровка, является действительным представлением 0.

Что именно я здесь упускаю?Они спроектировали getint () для создания бесконечного цикла, если входные данные отличны от 0-9?Зачем?

Вот их код для getint () [edit] с основным вызовом getint ():

int getint(int *);

int main()
{
        int n, array[BUFSIZE];
        for (n = 0; n < BUFSIZE && getint(&array[n]) != EOF; n++)
                     ;
        return 0;
}

 int getch(void);
 void ungetch(int);

int getint(int *pn)
{
        int c, sign;
        while (isspace(c = getch())
                ;
        if (!isdigit(c) && c != EOF && c != '+' && c != '-') {
                ungetch(c); //this is what i don't understand
                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;
}

int buf[BUFSIZE];
int bufp = 0;

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

void ungetch(int c)
{
        if (bufp >= BUFSIZE)
                printf("ungetch: can't push character\n");
        else
                buf[bufp++] = c;
}

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Смысл аналогичен scanf не потребляющим символам, которые не соответствуют спецификатору преобразования - вы не хотите использовать что-то, что не является частью действительного целого числа, но может бытьчасть допустимой строки или другой тип ввода.getint не имеет возможности узнать, является ли ввод, который он отклоняет, частью другого действительного нечислового ввода, поэтому он должен покинуть поток ввода так же, как он его нашел.

0 голосов
/ 18 мая 2018

Как написано в настоящее время, функция getint() пытается прочитать целое число из пользовательского ввода и помещает его в *pn.

  1. Если пользователь вводит положительное или отрицательное число(со знаком или без него), * pn обновляется до этого числа, а getint () возвращает некоторое положительное число (следующий символ после числа).

  2. Если пользователь вводит недействительное число, *pn не обновляется и getint() возвращает 0 (что означает, что он не выполнен).

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

    Это верно.Все последующие вызовы getint() не будут выполнены, поскольку последний символ был передан ungetch().То, что вы понимаете, правильно.

    Но именно так getint() должен обрабатывать ввод мусора.Он просто отклонит его и вернет 0 (что означает, что он потерпел неудачу).getint() не несет ответственности за нецелочисленный ввод и подготовку нового ввода для следующего чтения.Это не ошибка.

    Единственная ошибка заключается в том, что '-' или '+', за которыми следует не цифра, в настоящее время рассматривается как допустимое представление 0. Что оставлено читателю в качестве упражнения.

  3. Если пользовательский ввод EOF, *pn не обновляется (умножается на 1) и getint() возвращает EOF.

...