Я хочу, чтобы пользователь вводил только два целых числа и не более двух или менее двух. Кроме того, после недопустимого ввода, я хочу напечатать сообщение об ошибке и попросить пользователя снова ввести два целых числа. Пользователь должен ввести два целых числа, разделенных пробелом, а не новую строку. Так, например:
1) Действительный вход: 1 2
2) Неправильный ввод: 1
3) Неправильный ввод: 1 2 3Как предотвратить ввод пользователем более или менее ввода, чем требуется в C?
Я попытался его с двух следующих подходов:
#include<stdio.h>
int main(){
int first;
int second;
printf("Enter input:\n");
int returnValue = scanf("%d %d", &first, &second);
while(returnValue != 2){
printf("Invalid input. Please enter again: \n");
returnValue = scanf("%d %d", &first, &second);
}
printf("First: %d Second: %d\n", first, second);
return 0;
}
В этом первом подходе, включающем scanf, я не могу запретить пользователю вводить каждое целое число в строке новой строки. Я также не могу ограничить ввод только двумя номерами. То есть, если пользователь вводит более 2 целых чисел, тогда программа принимает первые 2 целых числа и игнорирует третью. Я хочу напечатать ошибку в этом случае.
Мой другой подход предполагает fgets и sscanf:
#include<stdio.h>
int main(){
int first;
int second;
printf("Enter input:\n");
char line[20];
fgets(line, sizeof(line), stdin);
int returnValue = sscanf(line, "%d %d", &first, &second);
while(returnValue != 2){
printf("Invalid input. Please enter again: \n");
fgets(line, sizeof(line), stdin);
returnValue = sscanf(line, "%d %d", &first, &second);
}
printf("First: %d Second: %d\n", first, second);
return 0;
}
В этом подходе, я могу напечатать сообщение об ошибке, если пользователь нажимает клавишу ВВОД после ввода только один целое. Но я не могу ограничить ввод только двумя номерами. То есть, если пользователь вводит более 2 целых чисел, тогда программа принимает первые 2 целых числа и игнорирует третью. Я хочу напечатать ошибку в этом случае.
Итак, мой вопрос в том, что мои требования достижимы путем изменения первого подхода, а также второго подхода?
Спасибо.
Без аппаратной поддержки (например, клавиатура со всеми отключенными буквами, какой-либо метод для электрокодирования пользователя, если они попали в букву А и т. Д.), Невозможно ПРЕДОТВРАТИТЬ пользователя от ввода любого вводимого им ввода. Самое большее, что вы можете сделать, это принять вход и проверить его. Если встречается недопустимый вход, некоторые варианты - игнорировать неисправные части, игнорировать некоторый блок данных (например, целую строку, если он содержит какой-либо плохой ввод), или просто отказаться от ввода и продолжать просить, пока пользователь не введет что-то действительное. – Peter
«Итак, мой вопрос в том, что мои требования достижимы путем изменения первого подхода, а также второго подхода?» -> Да, [пример] (http://stackoverflow.com/a/27805565/2410359), но не стоит. Пойдите с [@David Bowling] (http://stackoverflow.com/a/41917246/2410359) – chux