C语言scanf(“%d”,&a)输入非数字字符

之前回答过一个题主的提问感觉很有意思,记录一下。

#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;
}

在加入正则后,每次会在输入时清除一下当前输入缓冲区的内容,再次运行程序发现即使再次输入非数字字符后程序也不会陷入到无休止的循环之中,也可以证明以上的观点是正确的。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值