我正在编写一个简单的C程序,我想在其中验证用户对1-9整数的输入。
我的代码的逻辑似乎很好,但出于某种原因,如果我键入" lll"对于我的输入(或不在1-9之间的任何其他随机输入),它会在实际再次停止在getchar()之前几次在while循环中显示错误消息。
/**
* Validate user input and reprompt if invalid
* @return input - Users valid input
*/
int validateUserInput() {
int firstInput = getchar() - 48;
int secondInput = getchar();
while(secondInput != 10 || firstInput >= 10 || firstInput <= 0 ){
printf("Invalid Input. Please try again. \nEnter a number between (1-9): ");
firstInput = getchar() - 48;
secondInput = getchar();
}
return firstInput;
}
逻辑是:
输入无效 - 如果第二个输入!= 10,这意味着第二个字符不是回车键。
无效输入 - 如果第一个减去48的字符大于9或小于1,那么它太高了。
逻辑对我来说似乎不错,但是当我输入随机字符时,这里有一些输出:
Enter a number between 1-9: lllll
Invalid Input. Please try again.
Enter a number between 1-9: Invalid Input. Please try again.
Enter a number between 1-9: Invalid Input. Please try again.
Enter a number between 1-9: Invalid Input. Please try again.
Enter a number between 1-9: Invalid Input. Please try again.
Enter a number between 1-9: Invalid Input. Please try again.
Enter a number between 1-9:
为什么在实际让我再次输入输入之前它会重复那么多次?这就是我的计划的错误。
答案 0 :(得分:2)
你的逻辑很好。但是您输入的无效字符仍保留在输入缓冲区中。因此,后续调用getchar()
会读取它们。
每当您点击无效输入时,您都希望忽略它们。您可以使用如下循环读出它们:
while(secondInput != 10 || firstInput >= 10 || firstInput <= 0 ){
printf("Invalid Input. Please try again. \nEnter a number between (1-9): ");
int i;
while((i=getchar()) != '\n' && i != EOF);
...
说过,通常很难使用getchar()
和scanf()
系列函数来正确读取交互式输入并进行错误检查。更好的方法是阅读行(例如fgets()
)并解析/错误检查它们。
答案 1 :(得分:1)
因为您输入了5个字符。 5x L.你只检查一个字符,但你写了什么,我猜你要检查整个输入字符数组。那么你就不能使用getChar()。