Защита от дурака в консольном приложении - C (СИ)
Формулировка задачи:
Всем привет, начинал изучать си.
Сейчас пишу консольное приложение, вот, нужно сделать так чтобы пользователь мог вводить только некоторые цифры, в случае ввода не цифр выдавать ошибку. Как это сделать? Я смог сделать что-то похожее только для ввода букв. А как сделать чтобы можно было только определенные символы вводить?
Вот участок кода:
while (!scanf("%d", &checkbox))
{
while (getchar() != '\n');
printf("Oshibka! Povtorite vvod: ");
}
switch (checkbox)Решение задачи: «Защита от дурака в консольном приложении»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int main(){
int anna = 0;
anna = inputs("\n\t\t\tEnter a year: ");
printf("%d", anna);
return 0;
}
int inputs(char *message){
char input[256];
while (1)
{
printf(message);
fgets(input, 256, stdin); //stdin - то, что вводим с клавиатуры
int last = strlen(input) - 1; //укорачиваем строку, чтобы не брать \n
input[last] = '\0';
if ((strlen(input) > 4) || (strlen(input) < 4)){
printf("\n\t\t\tLength must be = 4. Try again");
continue;
}
int i, not_digit = 0;
for (i = 0; input[i] != '\0'; i++){
if (!isdigit(input[i]))
{
not_digit = 1;
printf ("\n\t\t\tYou would have to enter the number. Try again: \n");
break;
}
}
if (not_digit)
continue; //повторить
return atoi(input);
}
}
Объяснение кода листинга программы
- Объявление переменной
annaтипа int и присвоение ей значения 0. - Вывод сообщения с просьбой ввести год.
- Функция
inputsпринимает char* message в качестве параметра и не возвращает ничего. - В функции
inputsобъявление массиваinputтипа char с размером 256. - В функции
inputsцикл while(1) используется для повторного запроса ввода, если введенные данные некорректны. - В цикле while(1) выводится сообщение с просьбой ввести год.
- Функция fgets считывает строку из стандартного ввода (stdin), сохраняя символ новой строки.
- В функции
inputsвычисляется длина строки ввода, чтобы не учитывать символ новой строки при проверке длины. - В функции
inputsв цикле for проверяется каждый символ ввода. - Если символ не является числом, устанавливается флаг not_digit и выводится сообщение с просьбой ввести число.
- Если все символы ввода являются числами, функция atoi преобразует строку в int и возвращается из функции
inputs. - Если введенные данные некорректны, цикл while(1) повторяется.
- Если введенные данные корректны, функция
inputsвозвращает введенное значение. - Значение
annaприсваивается результату функцииinputs. - Функция main выводит значение
anna. - Функция main возвращает 0, что означает успешное завершение программы.
- Программа завершается.