scanf(“%d”,a)加“a”;而";语法绕过scanf
如果没有初始化(“mod=0”),则该代码将进入无限循环。 我不明白为什么这段代码会循环,即使我使用了getchar(); 删除缓冲区。 当我先键入“1”,然后键入“a”时,会出现一个无限循环。 有人能帮我理解这种情况吗scanf(“%d”,a)加“a”;而";语法绕过scanf,c,switch-statement,scanf,C,Switch Statement,Scanf,如果没有初始化(“mod=0”),则该代码将进入无限循环。 我不明白为什么这段代码会循环,即使我使用了getchar(); 删除缓冲区。 当我先键入“1”,然后键入“a”时,会出现一个无限循环。 有人能帮我理解这种情况吗 int main() { srand((unsigned)time(NULL)); int mod = 0; int val = 0; do { printf("\t----------------------------
int main()
{
srand((unsigned)time(NULL));
int mod = 0;
int val = 0;
do {
printf("\t-----------------------------\n");
printf("\t|%5s %5s %5s %5s|\n", "1.create", "2.modify", "3.print", "4.quit");
printf("\t|%15s","Input command : ");
scanf("%d", &mod);
printf("\t-----------------------------\n");
switch (mod){
case 1: random(); val++; break;
case 2: if(val != 0) { modify(); break; }
case 3: if(val != 0) { print(); break; }
default: getchar(); printf("\tUnknown Command!! Retry!! \n"); break;
}
} while (mod != 4);
}
我用Visual Studio 2015编译了这段代码。当您输入
a
时,它对于mod
是无效的输入,因为scanf()
要求%d
使用int
。所以它不会读入mod
。因此,mod
保留在上一次迭代中输入的mod
值
它进入无限循环的原因是scanf()
不会丢弃无效的输入。所以反复尝试读取a
,结果失败,循环继续
检查scanf()
的返回值并丢弃任何无效输入。
scanf()
对于读取用户输入是出了名的不好,使用它通常更难正确处理输入故障
更好的方法是使用读取行输入,然后使用解析
代码的问题是,一旦您输入了一个数字(这是一个有效的菜单选项),变量mod始终等于第一次输入时输入的相同数字(如果第二次输入错误)。这种行为来自这样一个事实,即
scanf(%d, &mod);
尝试读取整数,但例如,当您输入“a”作为第二个选项时,输入无法从标准输入中读取整数。因此,它不会输入switch方法的默认情况,因为变量mod等于您输入的第一个有效输入的输入 在
scanf
后面放一个print
语句,只是为了验证事情是否符合预期,或者附加一个调试器。出于好奇,为什么在变量为int
时输入char
?
scanf(%d, &mod);