do
{
printf("minutes: ");
scanf("%d", &minutes);
}while(minutes < 1);
對於上面的代碼,如果分鐘給出某個字符,那麼分鐘的值爲「2」。 如果先輸入一個負整數,然後再輸入一個字符,則「分鐘:」語句重複無限次。如果字符作爲輸入來代替整數,scanf是如何工作的
我在codeblocks中運行這個程序。爲什麼會發生?
do
{
printf("minutes: ");
scanf("%d", &minutes);
}while(minutes < 1);
對於上面的代碼,如果分鐘給出某個字符,那麼分鐘的值爲「2」。 如果先輸入一個負整數,然後再輸入一個字符,則「分鐘:」語句重複無限次。如果字符作爲輸入來代替整數,scanf是如何工作的
我在codeblocks中運行這個程序。爲什麼會發生?
在這種情況下它返回0
。函數scanf()
返回匹配的格式說明符的數量。在這種情況下,沒有匹配,因此它返回0
。
如果在調用scanf()
之前初始化number
然後失敗返回0
,你用來初始化number
值不調用scanf()
後更改。
如果您未初始化number
,則嘗試讀取值爲未定義的行爲。它將有一個不確定的價值,所以你不能預測它會是什麼樣的價值。
scanf("%d",&minutes)
不會讀取字符的值。 minutes
中的值將保持不變。該字符將保留在緩衝區中,scanf將繼續嘗試讀取並保持失敗。
scanf
的返回值將是讀取的元素數量,因此如果您輸入字符並且可用於打破循環,則它將爲0。
do
{
printf("minutes: ");
ret = scanf("%d", &minutes);
if (ret != 1)
break;
}while(minutes < 1);
當'scanf()'由於罕見的輸入錯誤而返回'EOF'時,會發生嘗試使用'number'的先前值的弱點。數字的狀態沒有定義。最好使用'scanf()'和朋友的返回值來引導邏輯,而不是先前的值。 – chux