例子如下:
本来是让用户输入整数,怎样防止用户不小心输入字符导致的程序错误?例如下面的代码,输入字符’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;
}
运行结果: