2015-05-19 44 views
-4

我修改了原始代碼,前兩個無效輸入提示正常工作。當我在這個提示符中執行相同的邏輯來開始一個新遊戲時,我的程序將無法識別無效輸入,並且輸入任何鍵將啓動一個新遊戲。無效輸入後重新提示用戶-C++

void newGame() 
{ 
    char newGameChoice = 'a'; 

    cout << "\n--------------------------------------------------------------------------------" << endl; 
    cout << "Press N to play a new game\n"; 
    cout << "Press X to exit\n\n"; 
    cout << "--------------------------------------------------------------------------------" << endl; 

    cin >> newGameChoice; 
    newGameChoice = toupper(newGameChoice); 

    if (newGameChoice == 'N'); 
    { 
     char userIn = 'a'; 
     char c = 'a'; 

     game(userIn, c); 
    } 

    while (newGameChoice != 'N' || 'X') 
    { 
     cout << "--------------------------------------------------------------------------------"; 
     cout << "\n   Invalid input. Please try again.\n" << endl; 
     cout << "--------------------------------------------------------------------------------" << endl; 
     newGame(); 
    } 
} 
+3

請提供更短的代碼示例 – Hcorg

+0

不相關的問題,但...你真的打算爲無窮遞歸嗎?通過沒有'start()'調用本身,而是將'start()'(在'main()'內)的調用放在一個無限循環中,您可以獲得相同的效果,並獲得更好的整體結果。 – mah

+0

你試過gdb嗎? – Brahim

回答

2

你的問題是這樣的:

if (begin != 'B'); 
    { 
     ... 
     cin >> begin; 
     begin = toupper(begin); 
     start(); <------ 

你又打電話start(),這將讀取另一個值成begin

請在發佈求助信息前多花點時間分析一下你的代碼,它會幫助你成長爲更多。

+0

幫我看看這裏!我認爲再次調用start()會是接受另一個輸入的最簡單方法。據我所知,這將重新初始化「開始」到「a」,然後提示用戶輸入新的信息。 我剛剛在程序集中進行了6個月的編程,我們必須多次調用一個函數,有時在其內部進行簡單的計算或控制用戶輸入,控制端口等等。自從我觸及C後的6個月這是我的第一個C++程序。 –

+0

再次調用'start()'_will_請求另一個輸入 - 第三個。第一個是你(可能故意用於測試)的那個壞了。第二個顯示在我粘貼的代碼片段中,在那裏你提示他們並讀入他們的輸入,但你忽略了第二個輸入。而不是使用它,你再次調用'start()'(這將導致第三個輸入)。 – mah

+0

因此,對於上面編輯過的修改後的代碼,這是一種「良好實踐」的方式來重新提示用戶輸入新內容嗎? –

2
while (newGameChoice != 'N' || 'X') 

相當於

while (newGameChoice != 'N' || 'X' != 0) 

也許你的意思是

while (newGameChoice != 'N' || newGameChoice != 'X') 

編輯: 的代碼是錯誤的,它已經被改寫,這裏是一個建議:

void newGame() 
{ 
    char newGameChoice = 'a'; 
    while (true) { 
    while (true) { 
     cin >> newGameChoice; 
     newGameChoice = toupper(newGameChoice); 
     if (newGameChoice != 'X' && newGameChoice != 'N') { 
     // Wrong input print error message 
     } else { 
     break; 
     } 
    } 
    if (newGameChoice == 'X') { 
     return; 
    } 
    game('a', 'a'); 
    } 
} 
0

您問題的一部分是您的start()方法不是以最合乎邏輯的方式設計的。目前,當輸入無效時,您嘗試讀入另一個輸入並再次呼叫start()。當您第二次調用start()時,它將從start()方法的開始處開始,不知道以前的輸入。

當你輸入一個無效的輸入時,你應該做的是使用while()循環,並且在輸入正確的輸入之前不會繼續。

void start() 
{ 
    ... 
    //Get initial user input 

    while begin != 'B' 
    { 
     Keep getting input if wrong 
    } 

    game(userIn, c); 

}

相關問題