[英]While loop won't break as intended in C
我正在嘗試學習如何使用C編程,並且偶然發現了一個似乎應該是簡單的解決方案的問題,但是它給了我比我預期的更多的問題。 我正在嘗試創建一個數字猜謎游戲,您有3次機會猜數字,但是我的問題是,當猜對了正確答案時,Do While循環不會中斷。 這是函數:
void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
int j=0;
do {
j++;
printf("Please enter a number between 0 and 100\n");
scanf("%d",&user_entry);
for(i = 0; i < MAX; i++)
{
if(user_entry==lucky[i])
{
printf("winner\n");
}
}
} while(user_entry==lucky[i]||j<3);
}
基本上,應該遍歷數組lucky [i]並檢查user_entry是否等於數組中20個數字中的任何一個。 截至目前,它循環遍歷,識別是否已從陣列中選擇了中獎號碼,但未從陣列中中斷。
當我將其更改為
}while(user_entry!=lucky[i]||j<3);
它完全忽略了計數器,只是永遠循環。
我不想使用break,因為我所讀到的所有內容都談到了不良的編程實踐。 還有另一種方法可以打破,或者只是犯了一個錯誤而導致了此問題。
提前致謝。
考慮一下索引變量“ i”的來源。 找到正確的用戶條目后會發生什么? 控制流向何處去?
我建議看看“ break”關鍵字。
您寫了while (user_entry == lucky[i]..)
,這意味着as long as user_entry is equal to lucky[i] keep on looping
。 這顯然不是您打算做的。
將您的條件轉換為} while (user_entry != lucky[i] && j < 3);
你應該沒事的 as long as user_entry is different of lucky[i] AND j is inferior to 3, keep looping
這將以普通英語翻譯。
但是使用它,即使i
沒有任何意義,您也可以測試lucky[i]
的值(當i等於max時,您不想對其進行測試,這屬於未定義行為的領域)。
但是,如果您確實不想使用break
關鍵字,則一種解決方案是使用標志。 開始循環之前將其設置為1,找到良好答案后將其更改為0。 您的代碼將成為
void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
int j=0;
char flag = 1;
do {
j++;
printf("Please enter a number between 0 and 100\n");
scanf("%d",&user_entry);
for(i = 0; i < MAX; i++)
{
if(user_entry==lucky[i])
{
printf("winner\n");
flag = 0;
}
}
} while(flag&&j<3);
}
}while(user_entry!=lucky[i]||j<3);
這是不好的邏輯-在用戶輸入的不是幸運數字或j小於3時循環播放? 當然您確實想要這樣:
}while(user_entry!=lucky[i]&&j<3);
這只是第二個問題的解決方案,它忽略了計數器-主要問題在其他答案中得到解決。
唯一獨立的條件是用戶還有更多的猜測。 嘗試一下
while(j <= 3);
小於應該是顯而易見的,但是等值屬於那里,因為您在循環之前增加了j,所以它將
j = 1 =>第一個猜測
j = 2 =>第二個猜測
j = 3 =>第三次猜測
之后,用戶將不再有任何猜測
您應該發現這是行不通的,這是因為如果用戶猜對了,我們想退出循環。 為此,您可以將int用作布爾值(0-false,1-yes)。
void Win_Search(int lucky[],const int MAX, int user_entry, int i)
{
int j=0;
int exitCase = 0;
do {
j++;
printf("Please enter a number between 0 and 100\n");
scanf("%d",&user_entry);
for(i = 0; i < MAX; i++)
{
if(user_entry==lucky[i])
{
exitCase = 1;
printf("winner\n");
}
}
} while(exitCase == 0 || j <= 3);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.