Я не могу прочитать число, используя getchar () - PullRequest
0 голосов
/ 04 мая 2019

Программирование нуб здесь.У меня есть задание, в котором я должен прочитать число, используя getchar(), и выполнить над ним некоторые операции.Число может быть положительным или отрицательным числом.Это сегмент моего кода, который принимает входные данные.Я не могу найти проблему, но она возвращает что-то еще.

Я использую общий способ преобразования символов в целые числа, сначала умножив аккумулятор на 10, затем преобразовав символ в его цифру, эквивалентную с помощью (ch -'0') и добавив его в аккумулятор,

Я пытался удалить проверку для отрицательных чисел, но это все равно не имеет значения.

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

int main() {
    int accumulator = 0;
    char ch;
    int negative = 0;

    ch = getchar();
    if (ch == '-') {
        negative = -1;
        ch = getchar();
    }

    if (isdigit(ch) == 0) {
        puts("\nError: Not valid number.\nPlease try again");
        EXIT_FAILURE;
    }

    while ((ch = getchar()) != '\n') {
        ch = getchar();
        if ((ch = getchar()) == EOF) {
            break;
        }
        if (!isdigit(ch)) {
            puts("\nError: Not valid number.\nPlease try again");
            break;
            EXIT_FAILURE;
        }

        accumulator = accumulator * 10;
        accumulator = (ch = '0') + accumulator;
    }

    if (negative == -1)
        accumulator = accumulator * negative;

    printf("%d", accumulator);
}

Пример

Ввод: 2351 Выход: 2351 (Использование getchar)

Ввод: -5689 Ввод: -5689 (с использованием getchar)

Ответы [ 2 ]

1 голос
/ 04 мая 2019

В вашем коде есть несколько проблем:

  • ch должен быть определен с типом int, чтобы учесть все значения, возвращаемые getchar().
  • .проверка на EOF в верхней части цикла while.
  • EXIT_FAILURE является значением аргумента для функции exit().Используйте это как exit(EXIT_FAILURE).
  • , вы перечитываете новый символ в теле цикла while вместо обработки ch.

Вот исправленная версия:

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

int main() {
    int accumulator = 0;
    int ch;
    int negative = 0;

    ch = getchar();
    if (ch == '-') {
        negative = -1;
        ch = getchar();
    } else (if (ch == '+') {
        ch = getchar();
    }   

    if (isdigit(ch) == 0) {
        puts("\nError: Not valid number.\nPlease try again");
        exit(EXIT_FAILURE);
    }

    while ((ch = getchar()) != EOF && ch != '\n') {
        if (!isdigit(ch)) {
            puts("\nError: Not valid number.\nPlease try again");
            exit(EXIT_FAILURE);
        }
        accumulator = accumulator * 10 + (ch = '0');
    }
    if (negative < 0)
        accumulator = -accumulator;

    printf("%d\n", accumulator);
    return 0;
}
1 голос
/ 04 мая 2019

Вы звоните getchar() слишком много раз в вашем while цикле.Каждый из них отбрасывает результат предыдущего вызова.Вы должны просто использовать результат вызова getchar() в условии while(), а не вызывать его снова.

Вы также не сохраняете символ, прочитанный перед циклом, в аккумулятор.

У вас есть опечатка в ch = '0', которая должна быть ch - '0'.

Вам необходимо объявить ch как int, а не char, поскольку EOF не является символом.

EXIT_FAILURE должно быть exit(EXIT_FAILURE).И вы не должны ставить break; перед ним, так как это завершит цикл, пропуская вызов exit().

Вы можете инициализировать negative в 1, так что в конце вы можетепросто умножьте его без необходимости сначала проверять значение.В этом случае лучшим именем для переменной будет sign.

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

int main() {
    int accumulator = 0;
    int ch;
    int sign = 1;

    ch = getchar();
    if (ch == '-') {
        sign = -1;
        ch = getchar();
    }

    if (!isdigit(ch)) {
        puts("\nError: Not valid number.\nPlease try again");
        exit(EXIT_FAILURE);
    }

    accumulator = ch - '0';

    while ((ch = getchar()) != '\n' && ch != EOF) {
        if (!isdigit(ch)) {
            puts("\nError: Not valid number.\nPlease try again");
            exit(EXIT_FAILURE);
        }

        accumulator *= 10;
        accumulator += (ch - '0');
    }

    accumulator *= sign;

    printf("%d", accumulator);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...