Как написать ввод функцию, которая будет проверять на валидность значения на языке C с некоторым условием?
Я пытался написать ввод функцию в виде:
static int correctInput(int* digit) {
char c;
while (scanf("%d%c", digit, &c) != 2 || c != '\n' || *digit < 2 || *digit > 10) {
printf("Некорректный ввод! Введите число (от 2 до 10 ): ");
while (getchar() != '\n') {}
}
}
Но после ввода значения, который не подходит под условие 2 <= base <= 10 дважды, то код ждет дополнительного Enter, так как:
while (getchar() != '\n') {} забирает перенос строки с собой ( ну это я так понял, возможно ошибаюсь )
Я решил эту проблему так:
static int correctBase(int* choice) {
char c;
while (1) {
c = getchar();
if (c == '\n') continue;
if (c >= '2' && c <= '9') {
*choice = c - '0';
while (c != '\n') c = getchar();
return 0;
}
while (c != '\n') c = getchar();
printf("Некорректный ввод! Введите число от 2 до 10: ");
}
}
Думал, ура, получилось, а потом я решил написать мини задачу, которая будет конвертировать из 10 СС в любую другую СС до 16 СС. Как сделать корректную функцию ввод проверку, для такого случая?
Ответы (2 шт):
Помог с решением данной дилеммы очень умный и хороший друг.
int GetNumberFromUser() {
int userInput;
int scanResult;
char nextChar;
do {
printf("Введите число ( от 2 до 16 ): ");
scanResult = scanf("%d", &userInput);
if (scanResult != 1) {
printf("Некорректный ввод! Введите число (от 2 до 16).\n");
while (getchar() != '\n');
userInput = 0;
} else {
nextChar = getchar();
if (nextChar != '\n' && nextChar != ' ' && nextChar != '\t') {
printf("Некорректный ввод! Введите число (от 2 до 16).\n");
while (nextChar != '\n') {
nextChar = getchar();
}
userInput = 0;
} else if (userInput < 2 || userInput > 16) {
printf("Некорректный ввод! Введите число (от 2 до 16).\n");
}
}
} while (scanResult != 1 || userInput < 2 || userInput > 16);
return userInput;
}
skip_line пропускает ввод до ближайшего конца строки. Возвращает истину, если в строке были только пробельные символы:
bool skip_line() {
bool spaces_only = true;
while (true) {
int c = getchar();
if (c == EOF) {
return false;
}
if (c == '\n') {
return spaces_only;
}
if (!isspace(c)) {
spaces_only = false;
}
}
}
input_range вводит число в указанном диапазоне. Число должно быть единственным на строке. Допускаются пробелы до и после числа. Если введено не число или число вне диапазона, программа сообщает об ошибке и повторяет ввод.
int input_range(int min, int max) {
while (true) {
printf("Введите число от %d до %d: ", min, max);
int n;
if (scanf("%d", &n) == 1) {
if (skip_line() && min <= n && n <= max) {
return n;
}
} else {
skip_line();
}
puts("Некорректный ввод!");
}
}