簡體   English   中英

While循環不會按C的預期中斷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM