2017-06-13 34 views
-1

我要求用戶通過輸入對應項目的整數選擇在一個揹包裏的物品之間進行選擇。但是,儘管我使用了當前的整數輸入驗證代碼,但整個程序終止而不是重新顯示選項並要求用戶再次輸入選項。下面的代碼中是否有任何問題可能導致此問題?程序終止,而不是繼續整數輸入確認循環

int num;  
    do{ 
     std::cout << "Choose item to use." << std::endl; 
     for(int i = 0; i < backpack->size(); i++){ 
      std::cout << i+1 << ". " << backpack->at(i) << std::endl;       
     }; 
     std::cin >> num; 
     if(!std::cin.fail()){ 
      if(num < 0 || num > (backpack->size())){ 
       std::cout << "Plese enter an integer in range." <<std::endl; 
      }else{ 
        break; 
      }; 
     }else{ 
       std::cin.clear(); 
       std::cin.ignore(80, '\n'); 
       std::cout << "Invalid input. Please enter an integer." << std::endl; 
     };      
    }while(std::cin.fail() || (num<0 || num > (backpack->size()))); 
+4

這聽起來像你可能需要學習如何使用調試器來逐步執行代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。延伸閱讀:如​​何調試小程序(http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – NathanOliver

+0

方案是否終止* *('的std :: terminate' )或者只是循環結束? –

+0

也請不要害怕空格。你的代碼很難閱讀,因爲你似乎不喜歡空格和空白喜歡 –

回答

2

你必須指定一個初始值爲num。如果您不這樣做,它將包含垃圾值,該值可能小於0或大於backpack->size()-1,這會使條件成立。

int num = 0; 
+0

沒有必要初始化'num'。它由流提取分配。 – Buster

+0

由於循環num的格式不需要初始化,所以在do while循環中,他會在它被使用之前將一個值輸入到num中。但是,如果你想檢查失敗,最好初始化爲一個對他的條件無效的值,所以......'int num = -1;' – Eddge

+0

檢查'num'來查看提取失敗?這將如何工作?您需要檢查流(OP正在或多或少地正確)。 – Buster

1

編輯:刮最後答案


以下明確cin.fail()標誌:

std::cin.clear(); 
std::cin.ignore(80,'\n'); 

所以在達到循環條件,cin.fail()回報falsethe unitialized num most likely contains 0。因此,你的繼續條件沒有通過,循環返回。

正如@Eddge所建議的那樣,您應該初始化num以符合您的條件的無效值,如-1

+0

我認爲他確實想繼續循環,如果num爲負數或大於揹包大小...但也許不是如果cin處於失敗狀態 – Eddge

+1

確實,重新閱讀代碼有助於^^對不起!如果OP確認,會刪除。 –

+0

目前,如果我在項目編號方面輸入範圍超出範圍,驗證工作正常。但是,當我嘗試輸入'a'而不是比如說1到5之間的整數時,程序完全終止而不是要求用戶再次嘗試輸入。 –

1

幾次找過代碼後,我沒有立即看到了問題的邏輯,雖然我可能是錯的。但是從我所瞭解的代碼的意圖來看,while語句中的條件是多餘且不必要的。您已經在if語句中檢查了相同的條件並在需要時跳出循環,因此請嘗試使用while(true)作爲while語句,看看它是否修復了您的問題。

0

我剛剛發現,在當條件不改變 「的std :: cin.fail()」 到 「!(給std :: cin >> NUM)」 的伎倆。你爲什麼這麼認爲?順便說一句,感謝您的所有輸入!