Существует число проблем с вашим кодом в его нынешнем виде.Во-первых, откровенные ошибки:
Выражение input % 5
даст вам остаток при делении на пять.Это означает, что вы получите ноль, если будет кратным, в противном случае ненулевое значение.К сожалению, ноль обрабатывается как false , поэтому это будет верно только в том случае, если input
равно , а не , кратному.Правильное выражение: (input % 5) == 0
.
Если вы введете что-то, что не может быть интерпретировано как целое число, scanf
не удастся и input
останется с тем значением, которое былозаранее.Это должно быть обнаружено и выполнено, проверив возвращаемое значение - это даст вам количество успешно отсканированных элементов, поэтому должно быть одним.
Ваш код, похоже, возвращает значение, если все в порядке, новернуть ничего , если оно недействительно.
Далее, хотя это и не ошибки, это мои личные предпочтения, которые могут облегчить чтение и обслуживание кода:
Я предпочитаю явно отдельных подвыражений, поэтому мне никогда не придется беспокоиться о правилах приоритета (при условии, что это не делает выражение нечитаемым в процессе).Для этого я бы сделал полное заявление if
if ((input >= 5) && (input <= 95) && ((input % 5 == 0))
.
Я не большой поклонник конструкции if (condition) transferControl else ...
, поскольку else
равен полностью лишнее.
Я также предпочитаю, чтобы перехват ошибок выполнялся в локализованном порядке в начале, чтобы выявить проблемы на ранней стадии.Только после того, как все проверки пройдены, вы выполняете часть успеха.
Функция (при условии, что это функция, которая кажется вероятной) обычно должна делать одну вещь,например, проверьте, является ли значение допустимым.Запись проблем в стандартный вывод, вероятно, лучше оставить вызывающей стороне, чтобы функция действительно использовалась повторно.Было бы лучше иметь функцию, выполняющую проверку и возвращающую некоторое значение, чтобы указать, был ли сбой, или с значением, если оно действительно.
Обычно лучше использовать puts("something")
, а не printf("something\n")
.Вызов printf
лучше всего оставить там, где вам действительно нужно для форматирования аргументов.
Учитывая все это, код, который я хотел быposit будет выглядеть следующим образом:
#include <stdbool.h>
bool InputValidRangeAndMultiple(
unsigned *pValue,
unsigned minVal,
unsigned maxVal,
unsigned multVal
) {
unsigned input;
// If no unsigned int available, error.
if (scanf("%u", pValue) != 1) return false;
// If value invalid in any way (range or multiple), error.
if ((*pValue < minVal) || (*pValue > maxVal)) return false;
if ((*pValue % multVal) != 0) return false;
// Value is now deemed okay.
return true;
}
Вызов этой функции может быть выполнен таким образом, с обработкой запросов и ошибок за пределами функции «ввода и проверки»:
#include <stdio.h>
unsigned value;
puts("Enter Value.\nValue must be divisible by 5 and within 5 and 95...");
if (! InputValidRangeAndMultiple(&value, 5u, 95u, 5u)) {
puts("Invalid input...");
returnOrDoSomethingIntelligent();
}
// The 'value' variable is now valid.