为了账号安全,请及时绑定邮箱和手机立即绑定

请大家帮我看看为什么这段代码一直是死循环(obejective-c)

请大家帮我看看为什么这段代码一直是死循环(obejective-c)

肥皂起泡泡 2019-04-07 09:38:36
当输入不满足第一个if语句的条件时,不是理想的重新给type1和type2赋值而是死循环。#importintmain(intargc,constchar*argv[]){@autoreleasepool{//6.5.1longinttype1,type2,flag=0;printf("请输入要测试的两个整数:");while(flag==0){scanf("%li%li",&type1,&type2);if((type1==(longint)type1)&&(type2==(longint)type2)&&type2!=0){if(type1%type2==0){printf("%li可以被%li整除",type1,type2);flag=1;}else{printf("%li不可以被%li整除",type1,type2);flag=1;}}else{printf("只能输入整数,并且第二个数不能为0,请重新输入:");}}return0;}}
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

你需要判断scanf的返回值,看是否有非法输入。如果有非法输入,先要清空之前输入的内容,比如用这段代码:
if(scanf("%li%li",&type1,&type2)!=2){//illegalinput
intch;
while((ch=getchar())!='\n'&&ch!=EOF){
//intendtobeblank
}
}
当然,一般都认为scanf不太安全,因此至少都应该用fgets以及sscanf改写:
charbuffer[256];
if(fgets(buffer,sizeof(buffer),stdin)==NULL){
//errorornomoretoread
//...
}
if(sscanf(buffer,"%li%li",&type1,&type2)!=2){//illegalinput
//printerrormessage
//continue
//...
}
PS.(type1==(longint)type1)&&(type2==(longint)type2)这句相当多余。
                            
查看完整回答
反对 回复 2019-04-07
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

这是C的问题而不是Objective-c的问题。
scanf如果遇到非法输入,会执行失败,但非法输入依然留在缓冲区中,等scanf再次请求输入时,会直接读取缓冲区而不等待终端输入。
解决方法,Theo已给出。
                            
查看完整回答
反对 回复 2019-04-07
  • 2 回答
  • 0 关注
  • 341 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信