之前回答过一个题主的提问感觉很有意思,记录一下。
#include <stdio.h>
int main(void)
{
int n;
printf("\nEnter n:\n");
scanf("%d",&n);
printf("%d%c",n,n);
while(n!=0){
printf("\nEnter n:\n");
scanf("%d",&n);
printf("%d%c",n,n);
}
return 0;
}
如果while循环中输入非预期的非数字字符后,整个函数会一直循环打印上一次输入的数字结果,例如第一次输入为数字64,再次进入到while循环时输入A,则函数会无限循环输出64。
在通过本地的调试之后,对于这个现象我的理解是这样的,scanf函数会开始读取输入字符,期望遇到数字字符或者是+,-,如果发现一个数字符号会将其保存放到缓存区,如果接下来还是数字符号继续保存再读取,一直持续下去,如果遇到非字符会认为当前输入结束,但这个字符他依旧也会放到输入缓存区,下次程序开始读取输入时,还是会再这个非数字字符开始读取,所以你输入非法字符后,后续会一直陷入循环。
int main(void)
{
int n;
printf("\nEnter n:\n");
scanf_s("%d", &n);
printf("%d%c", n, n);
while (n != 0) {
scanf_s("%*[^\n]");
scanf_s("%*c");
printf("\nEnter n:\n");
scanf_s("%d", &n);
printf("%d%c", n, n);
}
return 0;
}
在加入正则后,每次会在输入时清除一下当前输入缓冲区的内容,再次运行程序发现即使再次输入非数字字符后程序也不会陷入到无休止的循环之中,也可以证明以上的观点是正确的。