使用scanf进行validation检查在循环内不起作用

我正在尝试创建一个函数来检查用户的输入,并让他们再次尝试,以防他们输入错误的输入。

因此,当我在函数中输入错误的输入时,它会将我抛入无限循环。 我该怎么做才能解决它?

我被允许只使用getcharscanf进行用户输入。

 int sizeOfField() { int size,inputCheck,flag=0; while (!flag) { inputCheck= scanf(" %d ", &size ); if ( inputCheck < 1 ) { printf( "Invalid Input!\n" ); printf( "Try agian"); } else if (inputCheck == 1) flag=1; } return size; } 

允许仅使用getchar和scanf进行用户输入。

使用fgets()会更好。 但要忍受这种限制……


scanf(" %d ", &size ); 返回0,非数字输入保留在stdin

代码需要使用无效输入 – 这是OP代码中缺少的。

为了保持一致性,即使输入良好,也要消耗剩下的线路。 此代码不会检测同一行上的良好输入后是否存在尾随垃圾。

" %d "的第二个空格也是一个问题。 " "指示scanf()读取所有空白区域,直到检测到一些非空白区域 。 这意味着scanf(" %d ", &size ); 在输入"123\n4\n"类之前不会返回。 读取4 ,确定不是空白区域并放回以供稍后输入。 从格式中删除尾随空格。

如果输入返回EOF (文件结尾或罕见输入错误),代码也有问题。 函数sizeOfField()无法传达文件结尾。 function可以重新定义或暂时退出程序。

 int sizeOfField(void) { int inputCheck; do { int size; inputCheck = scanf("%d", &size); if (inputCheck == EOF) { break; } // consume rest of line int ch; while ((ch = getchar()) != '\n' && ch != EOF); if (inputCheck == 1) { return size; } if (ch == EOF) { break; } // Non-numeric input occurred. printf("Invalid Input!\n" "Try again"); fflush(stdout); } // No recovery possible exit(EXIT_FAILURE); } 

奇怪的是,这是" %d""%d"有益的情况。 当输入是非数字时,代码确定至少消耗了所有前导空格 (包括'\n' )。 如果需要将更多的一个字符“放回”到stdin ,那么由于非stdin而导致的租用者被放回的规范是有问题的。 没有这种保证, while ((ch = getchar()) != '\n' && ch != EOF); 可能不会消耗所有违规的非数字输入。