2016-11-15 71 views
0

所以我剛剛學會了輸入驗證,但是我遇到了一個問題。我強制用戶輸入一個數字而不是一個可用的字符串,但是如果用戶輸入一個數字(包含在開關盒中的數字)和一個字符串,那麼程序會崩潰。有什麼提示要改變什麼,以便確認對所有東西都有效?輸入驗證w /數字和字符串

int menu(double pi)                //menu for choosing a shape 
{ 
    int choice = 0; 
    cout << "Please select what you wish to calculate:\n\n1 - Area of a Circle\n\n2 - Circumference of a Circle\n\n3 - Area of a Rectangle\n\n4 - Area of a Triangle\n\n5 - Volume of a Cuboid\n\n "; 
    while (!(cin >> choice)) 
    { 
     cout << "Invalid input, please enter a number of 1-5\n\n"; 
     cin.clear(); 
     cin.ignore(100, '\n'); 
    } 
    system("CLS"); 

    switch (choice)                //switch case for each shape 
     { 
     case 1: 
      circleArea(pi); 
      break; 
     case 2: 
      circleCircum(pi); 
      break; 
     case 3: 
      rectanArea(); 
      break; 
     case 4: 
      triangArea(); 
      break; 
     case 5: 
      cubVol(); 
      break; 
     default: 
      cout << "Invalid input! Please try again.\n\n"; 
      break; 
     } 
    return 0; 
} 
+0

通常,如果您想要防彈代碼,您需要以字符串的形式讀取輸入內容,然後解析並將其轉換爲您想要的內容。 – NathanOliver

+0

呃,我有點明白你的意思,雖然不是很完美,如果不是問題,你會介意提供一些示例代碼嗎?我仍然是一個編程的菜鳥,在9月份開始 – PinkieBarto

回答

0

問題用

cin >> choice 

當輸入一個號碼是>>將停在第一個非數字輸入,只要有數字輸入,開始與它會將其視爲一個有效的閱讀。這意味着像2L,2.0-1T這樣的東西都是有效的整數輸入,就cin而言。它只是在流中留下無效部分。這是剩餘的蒸汽輸入,在下一次輸入操作時混淆程序。

解決此問題的一種方法是使用getline將輸入讀入std::string,然後解析字符串以確保其包含有效輸入。如果你想獲得實例int

int choice; 
std::string input; 
std::size_t pos; 
do 
{ 
    std::cout << "Enter Choice: "; 
    std::getline(cin,input); 
    choice = stoi(input, &pos); 
} while(pos != input.size()); 

這可以確保你在一切都讀了於推進入input和您只停止循環一旦進入一切都可以轉換爲有效的int

+0

我明白你在說什麼,但我試圖將其實施到我的程序中,但getline&stoi未被識別。是否有任何額外的庫我應該使用或? (只是使用) – PinkieBarto

+0

@PinkieBarto你需要''爲他們 – NathanOliver