Принуждение пользователя вводить целое число с помощью цикла While в C - PullRequest
0 голосов
/ 16 октября 2018

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

Введите наименьший оператор: введите наименьший оператор: введите наименьший оператор: введите наименьший оператор: введите наименьший оператор: введите наименьший оператор: ..........

Я думаю, что проблема со сканером, но я не уверен, как мне к нему подойти.

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

int main(int argc, const char * argv[]) {

    char operator;
    int largestOpperator, smallestOpperator;

    printf("Enter The Table Operator (+, -, *, /, %%, or R): ");
    scanf("%c",&operator);

    /*while(!(operator == '+' || operator == '-' || operator == '*' || operator == '/' ||operator == '%' || operator == 'R'))
    {

        printf("Enter Appropriate Table Operator (+, -, *, /, %%, or R): ");
        scanf(" %c",&operator); //requires space as a way to skip the enter when char is scanning!!
    }*/

    do{
        if(!isdigit(smallestOpperator))
            printf("Enter smallest operator: ");
        else{
            printf("Enter an actual number: ");
            scanf(" %d", &smallestOpperator);
        }

    }while(!isdigit(smallestOpperator));


    printf("Enter largest operator: ");
    scanf("%d", &largestOpperator);

    {
        printf("Enter a valid integer: ");
        scanf("%d", &largestOpperator);
    }


    return 0;
}

1 Ответ

0 голосов
/ 16 октября 2018

Очевидно, isdigit(smallestOperator) возвращает false, потому что это условие для while, и вы видите бесконечный цикл.

Разумный способ проверить значение smallestOperatorчтобы запустить ваш код в отладчике - это покажет вам тип переменной, ее значение, представление в памяти - все, что вам может понадобиться.

Более грязный способдобиться того же - добавить debugging printfs к вашему коду, чтобы напечатать значение до его проверки.

Однако мы можем видеть, что вы используете scanf(" %d", ...) для чтения smallestOperator.Страница man для scanf говорит:

d - соответствует необязательному десятичному целому числу со знаком;следующий указатель должен быть указателем на int.

Таким образом, вы получаете целое число из scanf, а затем проверяете, является ли это символ это цифра.

У вас есть два способа исправить это:

Читать символ, проверить его, преобразовать его

Получить символ от scanf: scanf(" %c", &smallestOperatorAsChar) - затем протестируйте его с помощью isDigit(), затем преобразуйте его в целое число: Преобразуйте символьную цифру в соответствующее целое число в C

(лучше) Пусть scanf ()сообщать вам об ошибках преобразования

В любом случае вы всегда должны проверять возвращаемое значение из вызовов ввода-вывода.scanf() возвращает количество элементов, которые были успешно преобразованы.Если оно меньше ожидаемого, вы можете использовать его для запуска обработки ошибок.

int rc = scanf("%d", &i);
char junkChar;
while(rc < 1) {
    printf("Invalid");
    scanf("%c", &junkChar);
    rc = scanf("%d", &i);
}

См .: почему scanf не ожидает ввода пользователя после сбоя один раз? - в котором принятый ответ отмечает, что scanf() не является отличным механизмом ввода стандартного ввода, поэтому вам не следует слишком усердно пытаться обойти его: либо возьмите управление в свои собственные подпрограммы вокруг fgets(), либо введитеумная библиотека.

...