问题描述
当输入不满足第一个if语句的条件时,不是理想的重新给type1和type2赋值而是死循环。
#import <Foundation/Foundation.h>int main(int argc, const char * argv[]){ @autoreleasepool {//6.5.1long 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; }}
问题解答
回答1:你需要判断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) 这句相当多余。
回答2:这是C的问题而不是Objective-c的问题。
scanf 如果遇到非法输入,会执行失败,但非法输入依然留在缓冲区中,等scanf再次请求输入时,会直接读取缓冲区而不等待终端输入。
解决方法,Theo已给出。