2017-05-31 221 views
-1

我有一個函數,它接受來自另一個函數的int值。當我輸入一個錯誤的int值時,它按預期工作(遞歸地調用相同的函數&讓我輸入一個新的數字),但是當我鍵入除int(a,%等)之外的任何東西時,它會遞歸地調用函數,但會卡住一個無限循環。任何幫助/見解都會很棒,因爲我處於C++編程的學習階段。C++遞歸函數無限循環

這裏是我完整的代碼片段(49線)

要總結一下我問的是我會怎樣正確去顯示錯誤並返回返回到主菜單而不觸發無限循環,當非int值給出。

int MainMenu(); 
void MainMenuSelection(int x); 

int main() 
{ 
    MainMenuSelection(MainMenu()); 
    return 0; 
} 

int MainMenu() { 
    int selection; 
    std::cout << "C++ Tutorials Main Menu\n"; 
    std::cout << "----------------------------------------------\n"; 
    std::cout << "1 - Chapter #1\n"; 
    std::cout << "2 - Chapter #2\n"; 
    std::cout << "3 - Chapter #3\n"; 
    std::cout << "----------------------------------------------\n"; 
    std::cout << "Please enter a cooresponding value: "; 
    std::cin >> selection; 

    if (std::cin.fail()) { 
     std::cout << "Input must be an integer"; 
    } 
    else { 
     return selection; 
    } 
} 

void MainMenuSelection(int x) { 

    if (x == 1) { 
     std::cout << "\nChapter #1 is unavailable.\n"; 
     std::cout << std::string(22, '\n'); 
     MainMenuSelection(MainMenu()); 
    } 
    else if (x == 2) { 
     std::cout << std::string(2, '\n'); 
     ChTwoMenuSelection(ChTwoMenu()); 
    } 
    else if (x == 3) { 
     std::cout << std::string(2, '\n'); 
     ChThreeMenuSelection(ChThreeMenu()); 
    } 
    else { 
     std::cout << "\nThere was an incorrect value submitted."; 
     std::cout << std::string(22, '\n'); 
     MainMenuSelection(MainMenu()); 
    } 

} 
+2

如果一個函數聲明返回一個值,但它實際上沒有這樣做,那麼你有*未定義的行爲*。在你的情況下,有一個執行路徑,你*不''返回任何'MainMenu'函數。 –

+0

另外,你爲什麼使用遞歸調用而不是循環?在你的情況下,循環會更有意義。 –

+0

正如'一些程序員夥計'所說:在這裏,你是不是**返回任何東西,但你必須:'如果(std :: cin.fail()){std :: cout <<「輸入必須是一個整數」 ; }'。 –

回答

0

函數MainMenuSelection(int x)需要int。主函數中的函數調用認爲它通過調用一個應該返回一個int的函數來得到這個,即int MainMenu()。但是這個函數並沒有做到你應該從一個已經以這種方式聲明的函數期望的東西。你應該確保函數應該總是返回值(當然除外)。

有像Cppcheck這樣的靜態代碼分析器可以幫助您分析代碼並找出可能出現的問題,例如上面提到的問題。

另一個提示是考慮執行代碼時會發生什麼。特別是當你的代碼仍然很小時,你可以手動查看這些語句來查看它需要的路徑,這樣你可以找出程序失敗的地方。