我一直在解決這個問題。問題的要求非常簡單。我想要做的只是檢查用戶輸入並允許用戶只輸入小寫字母。另一個約束是我只想使用scanf()來完成它。我知道我可以使用gets()和其他輸入函數,但仍然爲了更好地理解它,我想使用scanf()來做到這一點。在C中使用scanf進行模式匹配
我曾嘗試在GCC如下:
char str[100000];
return_value=scanf("%99999[a-z]",str);
if(return_value==0 || return_value==EOF)
{
printf("illegal input");
}
else
printf("input accepted");
下面的作品完全符合市場預期。所以如果用戶試圖用大寫字母輸入任何字符串,代碼只會輸出:「非法輸入」。
當我嘗試將上述代碼放在有限的while循環中時,問題就出現了。例如:
int counter=0;
char str[100000];
scanf("%2d",&counter);
while(counter>0)
{
fflush(stdin);
return_value=scanf("%99999[a-z]",str); //note
if(return_value==0 || return_value==EOF)
{
printf("illegal input");
}
else
printf("input accepted");
counter--;
}//end of while
在一旦用戶輸入變量「計數」的值,並按下回車鍵的上述情況下,控制馬上進入並輸出「非法輸入」,甚至不需要等待用戶輸入一個字符串。雖然用戶被允許進入
return_value=scanf("%99999c[a-z]",str); //note
在兩種情況下:
要糾正這個錯誤我試圖把下面的地方行標爲注:
return_value=scanf("%99999s[a-z]",str); //note
,甚至這在輸入'counter'變量的值之後的輸入字符串,用戶輸入消毒沒有完成,即,即使用戶輸入一個由大寫字符組成的字符串,輸出不是「非法輸入」(應該是這樣),而是「輸入接受」。
現在有人可以向我解釋這一點。我在哪裏錯了,或者我只是忽略了一些東西,做了一些愚蠢的錯誤?
我認爲這是正確的,但它不是很清楚。這意味着stdin *上的輸入不會消失*。所以壞字符保持不變,並在循環的下一次循環中由scanf()讀取。 – 2012-09-16 11:43:07
但我確實在while循環開始時使用了fflush(stdin)。它會不會照顧清理? – qre0ct
@Yossarian ... uuh ...老兄m對不起,但我真的不明白你的意思....請你詳細說明 – qre0ct