如何避免“定义为int型变量,却输入了字符,倒致陷入无限死循环”问题?

例子如下:
本来是让用户输入整数,怎样防止用户不小心输入字符导致的程序错误?例如下面的代码,输入字符’a’就会出现死循环,怎样解决?

#include <stdio.h>

int main() {
int a = 0; // 素数的个数
int num = -1; // 输入的整数
while (num > 32767 || num <= 0)
{
printf("请输入大于0且小于等于32767的整数n:");
scanf("%d", &num);
if (num > 0 && num <= 32767) break;
}

for (int i = 2; i < num; i++) {
if (num % i == 0) {
a++; // 素数个数加1
}
}
if (a == 0) {
printf("%d是素数。\n", num);
}
else {
printf("%d不是素数。\n", num);
}
return 0;
}

很容易想到以下这种方法(仅仅这样想感觉没啥问题,但实际上还是会无限循环):
判断一下输入的值,如果是数字再执行下面的语句块。不是数字就输出"输入异常字符,请输入整数n:"
while (num > 32767 || num <= 0)
{
printf(“请输入大于0且小于等于32767的整数n:”);
while(scanf("%d", &num)==0){
printf(“输入异常字符,请输入整数n:”);
}
if (num > 0 && num <= 32767) break;
}
运行结果如下:
在这里插入图片描述
啰嗦了这么多,真正的解法请看下面:
为了防止暴力输入,以字符数组(C语言中没有字符换)接收所输入的内容,判断字符数,当大于5时提示错误,当小于5时,判断字符数组中的每个字符是否都小于等于‘9’并且大于等于‘0’,不符合条件时提示错误,符合时转换为int,再判断该数是否>0并且<=32767,若满足,则该数即为满足题目所有要求的正确输入数,否则提示错误并重新输入。具体如下:

#include <stdio.h>
#include <math.h>
#include <string.h>

int main() {
int a = 0; // 素数的个数
char num[100000];int n[100000]; // 输入的整数
int istrue=0;int m=1,t=0;
while (!istrue){
printf("请输入大于0且小于等于32767的整数n:");
gets(num);
if(strlen(num)>5) continue;
for(int i=0;i<strlen(num);i++){//判断是否有其他字符
    if(num[i]>='0'&&num[i]<='9'){
        n[i]=num[i]-'0';
        if(i==strlen(num)-1)
            istrue=1;
    }
    else
        break;
}
if(istrue){
    for(int i=1;i<strlen(num);i++)
        m*=10;
    for(int i=0;i<strlen(num);i++){//将字符数组转换成int型整数
        t+=n[i]*m;
        m/=10;
    }
    if(t<=0||t>32767){//判断这个数是否在0~32767之间
            istrue=0;
            continue;
    }
}
}


for (int i = 2; i < t; i++) {
if (t % i == 0) {
a++; // 素数个数加1
}
}
if (a == 0) {
printf("%d是素数。\n", t);
}
else {
printf("%d不是素数。\n", t);
}
return 0;
}

运行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值