Как я могу получить безопасный ввод целого числа (особенно положительного числа), используя scanf
или gets
? Я пробовал несколько решений, и у каждого решения были свои проблемы.
1. Использование getchar()
для удаления строковых входов
int safeInput() {
int input;
scanf("%d", &input);
while(getchar() != '\n');
return input;
}
Этот метод эффективно обрабатывает строковые входы, однако, если вводятся такие строки, как 3a
, значение input
становится 3
, что не является истинным дескриптором исключения.
2. Получение ввода в виде строки с последующим преобразованием в целочисленное значение.
int safeInput() {
char[200] input, safe_input;
gets(input);
// I know about the security issue about gets - but it's not the point.
int i = 0;
while (1) {
if (input[i] >= 48 && input[i] <= 57) safe_input[i] = input[i];
else break;
i++;
}
return atoi(safe_input);
}
У этого метода есть проблема, что он не может обработать, если была введена строка, которая имеет большую длину, чем выделено для input
.
3. Что если определить строку с помощью указателя?
Я обеспокоен определением input
указателем, как char *input;
. Однако, как только я выполнил gets(input)
(или scanf("%s", input)
), это вызвало ошибку времени выполнения.
Итак, как правильно извлечь целочисленное значение из окна консоли, используя scanf
или gets
?