cari

Rumah  >  Soal Jawab  >  teks badan

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 hari yang lalu462

membalas semua(2)saya akan balas

  • 伊谢尔伦

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

    Anda perlu menilai nilai pulangan scanf untuk melihat sama ada terdapat input haram. Jika terdapat input yang menyalahi undang-undang, anda mesti mengosongkan kandungan yang dimasukkan sebelum ini, sebagai contoh, gunakan kod ini:

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

    Sudah tentu, scanf umumnya dianggap kurang selamat, jadi sekurang-kurangnya ia harus ditulis semula dengan fgets dan 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) Ayat ini agak berlebihan.

    balas
    0
  • 迷茫

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

    Ini adalah masalah C bukan masalah Objektif-c.

    Jika scanf menemui input yang tidak sah, ia akan gagal untuk melaksanakan, tetapi input yang tidak sah masih akan kekal dalam penimbal Apabila scanf meminta input sekali lagi, ia akan terus membaca penimbal tanpa menunggu input terminal.

    Penyelesaian telah diberikan oleh Theo.

    balas
    0
  • Batalbalas