使用scanf进行validation检查在循环内不起作用
我正在尝试创建一个函数来检查用户的输入,并让他们再次尝试,以防他们输入错误的输入。
因此,当我在函数中输入错误的输入时,它会将我抛入无限循环。 我该怎么做才能解决它?
我被允许只使用getchar
和scanf
进行用户输入。
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);
可能不会消耗所有违规的非数字输入。