验证输入进入无限循环

时间:2019-11-19 04:47:21

标签: c validation goto

我正在尝试验证输入(如果不是1到3),它将提示输入无效,并且尝试获取新输入,直到输入有效为止。

当我尝试输入1到3之间的任何数字时,这段代码运行良好,但是一旦我输入了字母,代码就会陷入无限循环。

    int searchBy;

searchInput:
    printf("1 - Search by id\n");
    printf("2 - Search by name\n");
    printf("3 - Search by marks\n>> ");
    printf("Please choose the searching method\n>> ");
    scanf("%d", &searchBy);
    if(searchBy >= 1 && searchBy <= 3){
        printf("Success");
    }
    else{
        printf("\nInvalid input please try again...\n\n");
        goto searchInput;
    }

我尝试使用while循环,但是当我尝试输入字母时,它仍然会进入无限循环。程序似乎没有在scanf停滞,而是继续循环

while(searchBy >= 1 && searchBy <= 3 != 1){
        printf("\nInvalid input please try again...\n\n");
        printf("1 - Search by id\n");
        printf("2 - Search by name\n");
        printf("3 - Search by marks\n>> ");
        printf("Please choose the searching method\n>> ");
        scanf("%d", &searchBy);
    }

3 个答案:

答案 0 :(得分:1)

您将需要使用scanf不接受的字符..... 一种解决方案是在'scanf'之后使用getchar()

scanf("%d", &searchBy);
getchar();//consume the character not accepted by scanf
if(searchBy >= 1 && searchBy <= 3){
    printf("Success");
}
else{
    printf("\nInvalid input please try again...\n\n");
    goto searchInput;
}

答案 1 :(得分:1)

在任何需要特定输入的情况下,您都想连续循环 ,直到用户提供所需的输入为止。 (迫使用户输入您需要的内容),处理所有无效输入,然后重复进行直到获得所需的内容,或者用户生成手册EOF取消输入。

由于发生输入错误,scanf中剩余的内容,尝试使用stdin进行读取对于新C程序员来说充满了陷阱。使用fgets()或POSIX {等面向行的输入函数,声明一个足够大小的缓冲区来处理所有用户输入(包括意外踩到键盘的猫),要好得多。 {1}},然后从填充的缓冲区中解析您所需的信息。

在这种情况下,由于您只关心输入的第一个字符,因此根本不需要转换,只需对第一个字符getline()进行操作即可。

您可以执行以下操作:

switch()

注意:,您甚至可以使用#define MAXC 1024 /* if you need a constant, #define one (or more) */ ... char buf[MAXC]; /* buffer to hold entire line of input */ while (1) { /* loop continually until user chooses quit (or generates EOF) */ /* display menu */ fputs ( "\n1 - Search by id\n" "2 - Search by name\n" "3 - Search by marks\n" "q - quit\n\n" "choose search method: ", stdout); /* read entire line -- validate */ if (fgets (buf, MAXC, stdin) == NULL) { fputs ("(user canceled input)\n", stderr); break; } switch (*buf) { /* switch on 1st char in buf */ case '1': /* do search by id here */ break; case '2': /* do search by name */ break; case '3': /* do search by marks */ break; case 'q': goto done; /* goto only used to break nested statements */ break; default: /* always handle the default: case */ fputs ("error: invalid choice.\n", stderr); break; } } done:; /* goto label */ ,就像您最初尝试的那样。另外请注意,您只需要一次调用输出函数即可显示菜单。将连接所有相邻的双引号字符串。)

仔细检查,尝试一下,如果您还有其他问题,请告诉我。

答案 2 :(得分:0)

!用于否定条件

 int x;
 printf("1 - Search by id\n");
 printf("2 - Search by name\n");
 printf("3 - Search by marks\n>> ");
 printf("Please choose the searching method\n>> ");
 x=scanf("%d", &searchBy);
while( !(searchBy >= 1 && searchBy <= 3) || (x!=1) ){
    printf("\nInvalid input please try again...\n\n");
    printf("1 - Search by id\n");
    printf("2 - Search by name\n");
    printf("3 - Search by marks\n>> ");
    printf("Please choose the searching method\n>> ");
    x=scanf("%d", &searchBy);
}