Проблемы с использованием getchar() вместо scanf()

У меня возникли проблемы с выполнением этого упражнения для программирования на C. Мне нужно использовать метод getchar() вместо scanf(). Когда я использую scanf, все работает идеально, когда я набираю, например, 7. Однако, когда я использую getchar() и набираю 7, я получаю ASCII-код 7, а не int 7. Как мне это исправить?

#include <stdio.h>
    #include <stdlib.h>

    int main(void) {
        int i;

        printf("Voer een getal in:\n");
        fflush(stdout);

        i = getchar();
        //scanf("%d", &i);

        if (i > -1000 && i < +1000) {
            printf("het ingevoerde getal is: %d\n", i);
        } else {
            printf("foutieve invoer\n");
        }

        return EXIT_SUCCESS;
    }

person viddrawings    schedule 07.05.2014    source источник


Ответы (1)


Это правильное поведение getchar. В то время как спецификатор формата scanf %d преобразует последовательность цифр в десятичное число, с getchar вам нужно сделать это самостоятельно.

Для этого нужно знать три вещи:

  1. Когда последовательность цифр заканчивается,
  2. Как преобразовать код ASCII цифры в число и
  3. Как объединить несколько цифр в одно число.

Вот ответы:

Вы можете прекратить ввод символов, когда значение, возвращаемое функцией getchar, не является цифрой. Для этого вы можете использовать функцию isdigit (включите заголовок <ctype.h>, чтобы использовать его).

Вы можете преобразовать однозначный символ в соответствующее ему числовое значение, вычитая код нуля (т. е. '0') из значения, возвращаемого getchar.

Вы можете объединить несколько цифр в число, начав частичный результат с нуля, а затем умножив его на десять и добавив к нему значение следующей цифры.

int num = 0;
for (;;) {
    int ch = getchar();
    if (!isdigit(ch)) break;
    num = 10 * num + (ch - '0');
}
person Sergey Kalinichenko    schedule 07.05.2014
comment
Отличный ответ. В этом случае я часто использую элегантный прием: если c содержит цифру, то c-'0' вернет ее. - person Benesh; 07.05.2014
comment
+1. Небольшое уточнение: путем вычитания символа нуля (т.е. '0') - не обязательно должен быть ASCII. - person chux - Reinstate Monica; 07.05.2014