搜索

首页  >  问答  >  正文

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

当输入不满足第一个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;
    }
}
黄舟黄舟2769 天前463

全部回复(2)我来回复

  • 伊谢尔伦

    伊谢尔伦2017-04-21 11:19:44

    你需要判断scanf的返回值,看是否有非法输入。如果有非法输入,先要清空之前输入的内容,比如用这段代码:

    if (scanf("%li %li", &type1, &type2) != 2) { // illegal input
        int ch; 
        while ((ch = getchar()) != '\n' && ch != EOF) {
            // intend to be blank
        }
    }
    

    当然,一般都认为scanf不太安全,因此至少都应该用fgets以及sscanf改写:

    
    char buffer[256];
    if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
        // error or no more to read
        // ...
    }
    
    if (sscanf(buffer, "%li %li", &type1, &type2) != 2) { // illegal input
        // print error message
        // continue
        // ...
    }
    

    PS. (type1 ==(long int) type1) && (type2 ==(long int) type2) 这句相当多余。

    回复
    0
  • 迷茫

    迷茫2017-04-21 11:19:44

    这是C的问题而不是Objective-c的问题。

    scanf 如果遇到非法输入,会执行失败,但非法输入依然留在缓冲区中,等scanf再次请求输入时,会直接读取缓冲区而不等待终端输入。

    解决方法,Theo已给出。

    回复
    0
  • 取消回复