Очевидно, 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()
, либо введитеумная библиотека.