檢查返回值scanf
。它將返回成功匹配和分配的項目數量。在這種情況下,如果輸入一個字符串,那麼它將不會被匹配和分配,但字符串保留在輸入緩衝區中,並且scanf
會嘗試在每次迭代中讀取它並失敗,從而出現問題。
您可以更改代碼:
int main() {
int secret, answer;
srand((unsigned)time(NULL));
secret = rand() % 10 + 1;
do {
printf ("Guess a number between 1 and 10");
if (scanf ("%d",&answer) != 1)
{
printf ("\nPlease enter an integer\n\n");
scanf ("%*s");
continue;
}
if (secret<answer) puts ("Guess a higher value");
else if (secret>answer) puts ("Guess a lower value");
} while (secret!=answer);
puts ("Congratz!");
return 0;
}
注意,if
裏面的線scanf ("%*s");
完成。在%*s
中,*
是輸入壓縮指示符,這表示將讀取一個字符串(代表%s
),但*
表示儘管字符串將從輸入中讀取,但將被丟棄。這是爲了簡單地丟棄之前輸入的字符串而不被scanf ("%d",&answer)
讀取。如果不放棄緩衝區中的字符串,它將保持不變,並且每次迭代scanf ("%d",&answer)
將無法匹配任何整數,因爲它將遇到輸入緩衝區中的剩餘字符串。
另一方面,您可能會讀取一個字符串並將字符串轉換爲整數。
像如下:
int main() {
int secret, answer;
char buff[128];
srand((unsigned)time(NULL));
secret = rand() % 10 + 1;
do {
printf ("Guess a number between 1 and 10");
scanf ("%s",buff);
if ((answer = atoi (buff)) == 0)
{
printf ("\nPlease enter an integer\n\n");
continue;
}
if (secret<answer) puts ("Guess a higher value");
else if (secret>answer) puts ("Guess a lower value");
} while (secret!=answer);
puts ("Congratz!");
return 0;
}
atoi()
將一個字符串轉換爲一個整數(在10個鹼基)。如果包含整數的字符不包含有效數字,則將返回0
。檢查它我們可以檢測用戶輸入是否正確。此外,因爲您的應用程序需要輸入1到10之間的整數,因此不包含0,因此可以將0作爲無效。要獲得檢測無效整數格式更好的控制,並在字符串中錯誤的位置使用strtol()
這是C,而不是C++。 –
相應地更改標籤(C不是C++)。 –
噢,這是?那麼......這個例子不是很簡單嗎? C和C++不是很相似嗎?這個例子在兩種語言中並不是那麼不同。 – user1431627