关于建立某个系统中输入的问题

我定义了一个整型n,用scanf输入值,然后又用到swicth中,但当我输入字符的时候却会进入死循环

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这是因为当你输入字符时,scanf函数会将字符留在输入缓冲区中,而switch语句又会不断读取缓冲区的内容进行匹配,导致了死循环。

为了避免这种情况,可以在使用scanf函数后使用fflush(stdin)函数清空输入缓冲区,或者使用getchar函数将输入缓冲区中的字符读取并忽略掉。例如:

int n;
scanf("%d", &n);
fflush(stdin);  //清空输入缓冲区
switch(n) {
    //...
}


或者:

int n;
scanf("%d", &n);
while(getchar() != '\n');  //读取并忽略输入缓冲区中的字符
switch(n) {
    //...
}


这样就能避免由于输入错误类型导致的死循环问题。

用%d输入时,输入字符就会是这个效果

该回答引用ChatGPT

这是因为当您使用scanf函数输入一个字符时,它会将字符存储在输入缓冲区中。然后当您尝试读取下一个输入时,scanf函数会继续从缓冲区中读取先前输入的字符而不会等待新的输入,这会导致无限循环。

为了解决这个问题,您可以在使用scanf函数读取字符后,使用另一个getchar()函数来读取输入缓冲区中的换行符。例如:


int n;
scanf("%d", &n);
getchar();  // 读取输入缓冲区中的换行符

switch (n) {
    // ...
}

在上面的代码中,getchar()函数会读取输入缓冲区中的换行符,这样在下一次使用scanf函数之前,缓冲区中的字符就会被清空,避免了死循环的问题。

因为遇到非数字也非分隔符的时候,scanf+%d的组合不会将它从缓冲区里读出来,而会留在里面
你应该判断scanf的返回值,如果出错了就用gets将缓冲区清空,要求用户重新输入
否则肯定是死循环呀

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^