当输入不满足第一个if语句的条件时,不是理想的重新给type1和type2赋值而是死循环。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
//6.5.1
long int type1, type2, flag=0;
printf("请输入要测试的两个整数:");
while (flag==0) {
scanf("%li %li", &type1, &type2);
if( (type1 ==(long int) type1) && (type2 ==(long int) 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,请重新输入:");
}
}
return 0;
}
}
伊谢尔伦2017-04-21 11:19:44
scanfの戻り値で不正な入力がないか判断する必要があります。不正な入力がある場合は、まず以前に入力した内容をクリアする必要があります。たとえば、次のコードを使用します:
リーリー もちろん、一般に scanf
はあまり安全ではないと考えられているため、少なくとも fgets
と sscanf
で書き換える必要があります。 scanf
不太安全,因此至少都应该用fgets
以及sscanf
改写:
if (scanf("%li %li", &type1, &type2) != 2) { // illegal input
int ch;
while ((ch = getchar()) != '\n' && ch != EOF) {
// intend to be blank
}
}
PS. (type1 ==(long int) type1) && (type2 ==(long int) type2)
リーリー
(type1 ==(long int) type1) && (type2 ==(long int) type2)
この文はかなり冗長です。 🎜迷茫2017-04-21 11:19:44
これは C の問題であり、Objective-C の問題ではありません。
scanf が不正な入力に遭遇した場合、実行は失敗しますが、不正な入力はバッファ内に残ります。scanf が再度入力を要求すると、端末の入力を待たずにバッファを直接読み取ります。
解決策はテオによって与えられました。