scanf(“%d”,a)加“a”;而";语法绕过scanf

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----------------------------

如果没有初始化(“mod=0”),则该代码将进入无限循环。 我不明白为什么这段代码会循环,即使我使用了getchar(); 删除缓冲区。 当我先键入“1”,然后键入“a”时,会出现一个无限循环。 有人能帮我理解这种情况吗

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);