在getchar()停止之前重复进入while循环

时间:2016-09-04 19:37:33

标签: c

我正在编写一个简单的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: 

为什么在实际让我再次输入输入之前它会重复那么多次?这就是我的计划的错误。

2 个答案:

答案 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()。