[英]Validation check with scanf does not work inside a loop
我試圖提供一種功能來檢查用戶的輸入,並讓他們在輸入錯誤的輸入時再次嘗試。
因此,當我在函數中輸入錯誤的輸入時,它將使我陷入無限循環。 我該如何解決?
我只允許使用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()
無法傳達文件結尾。 可以重新定義功能,或者暫時退出該程序。
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);
可能不會消耗掉所有有害的非數字輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.