验证输入进入无限循环
Validating Input goes into infinite loop
我正在尝试验证输入,如果它不是 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);
}
!用于否定条件
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);
}
您将需要消耗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;
}
在任何需要特定输入的情况下,您都希望不断循环,直到用户提供您需要的输入。 (强制用户输入您需要的内容),处理任何无效输入,并重复直到您得到您需要的内容或用户生成手动 EOF
取消输入。
尝试使用 scanf
读取对于新的 C 程序员来说充满了陷阱,因为在输入错误的情况下会在 stdin
中留下什么。使用 line-oriented 输入函数,例如 fgets()
或 POSIX 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 */
(注意: 你甚至可以使用你的 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);
}
!用于否定条件
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);
}
您将需要消耗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;
}
在任何需要特定输入的情况下,您都希望不断循环,直到用户提供您需要的输入。 (强制用户输入您需要的内容),处理任何无效输入,并重复直到您得到您需要的内容或用户生成手动 EOF
取消输入。
尝试使用 scanf
读取对于新的 C 程序员来说充满了陷阱,因为在输入错误的情况下会在 stdin
中留下什么。使用 line-oriented 输入函数,例如 fgets()
或 POSIX 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 */
(注意: 你甚至可以使用你的 goto
,只是不像你最初尝试的那样。还要注意你只需要调用一个输出函数来显示你的菜单。预处理器将连接所有相邻的双引号字符串。)
检查一下,尝试一下,如果您还有其他问题,请告诉我。