我试图编写一个简单的二进制计算器来重新认识C.出于某种原因,第一次输入验证工作正常,即使数字的第二次验证以几乎相同的方式写入,如果用户输入错误输入,while循环无限循环,无需等待新用户输入。这是代码,感谢您的帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char operator[20];
char valid_operator[4] = "+-*/";
printf("Enter operator: ");
scanf("%s", operator);
printf("You entered: %s\n", operator);
while(strchr(valid_operator, (int)operator[0]) == NULL) {
printf("%s is not a valid operator. Enter +, -, /, or *: ", operator);
scanf("%s", operator);
}
代码一直在这里工作。如果用户第一次输入错误输入,则下一部分将被抛入无限循环。重新提示永远不会发生。
int input1;
int input2;
printf("Enter the two inputs (separated by whitespace): ");
int num_ints = 1;
num_ints = scanf("%d %d", &input1, &input2);
printf("Input 1: %d. Input 2: %d.\n", input1, input2);
while(num_ints < 2){
printf("Invalid input. Enter two integers separated by whitespace: ");
num_ints = 0;
num_ints = scanf("%d %d", &input1, &input2);
printf("Input 1: %d. Input 2: %d.\n", input1, input2);
}
return 0;
答案 0 :(得分:1)
无限循环而不等待新用户输入的原因是scanf
无法以请求的格式读取char(在您的情况下为%d
)< strong>它不会提前文件指针,并且在循环的下一次迭代中,它将尝试再次读取相同的错误字符。
这与POSIX:http://pubs.opengroup.org/onlinepubs/009695399/functions/fscanf.html
一致如果比较显示它们不相等,则指令失败,不同和后续字节将保持未读。
此外,从man scanf
:
...返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。
因此,您最好将fgets
和sscanf
合并。
do {
char buf[BUFSZ];
printf("Enter the two inputs (separated by whitespace): ");
if(fgets(buf, BUFSZ, stdin) == NULL)
{
/* Error exit. */
break;
}
num_ints = sscanf(buf, "%d %d", &input1, &input2);
} while(num_ints != 2);
答案 1 :(得分:0)
你需要清除标准输入。如果在示例“1 t”中输入非整数,则不会消耗“t”(在流中保留)。将其添加到循环中:
while(num_ints < 2){
while (fgetc(stdin) != '\n'); // clear input
. . .
有关该问题的详细说明,请参阅C program loops infinitely after scanf gets unexpected data。