2012-05-22 29 views
1

我有一個程序,要求用戶輸入範圍[0,2]的整數。我使用以下鏈接作爲指導。如何使用cin實現單行整數類型命令行輸入驗證?

Good input validation loop using cin - C++

然而,當用戶按下不輸入數據輸入光標只是去在命令提示符下一條線,而我寧願它提示用戶輸入有效的數字。在這種情況下提示用戶是否有意義,還是有理由不實施驗證作爲單行輸入開始?在字符串的情況下,我會使用getline來解決這個問題,我應該在這種情況下以某種方式使用它嗎?這裏是我的代碼,基於上面的鏈接:

#include <iostream> 

int main() 
{ 
    int answeredNumber; 
    while(1) 
    { 
     std::cout << "Enter your answer: "; 
     if(std::cin >> answeredNumber && answeredNumber >= 0 && answeredNumber <= 2) 
     { 
      break; 
     } 
     else 
     { 
      std::cout << "Please enter a valid answer: " ; 
      std::cin.clear(); 
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     } 
    } 
    system("pause"); 
} 

回答

3

這是因爲掌握cin整數會跳過前導空白,包括一個換行符。有沒有簡單的方法。

如果你想基於行輸入,你可以得到你的輸入值作爲字符串,然後解釋說:

#include <iostream> 
#include <sstream> 
#include <string> 

int main (void) { 
    std::string inputLine; 
    int answer; 
    std::cout << "Enter your answer: "; 
    while(1) { 
     getline (std::cin, inputLine); 
     std::stringstream ss (inputLine); 
     if ((ss >> answer)) 
      if ((answer >= 0) && (answer <= 2)) 
       break; 
     std::cout << "No, please enter a VALID answer: " ; 
    } 
    std::cout << "You entered " << answer << '\n'; 
    return 0; 
} 
+0

謝謝你,我會閱讀sstream的文檔。 – newToProgramming

1

對方回答指定問題。然而,一個輕微修改你的代碼,我認爲會解決你眼前的問題:

int answeredNumber = std::cin.get() - '0'; 
if(answeredNumber >= 0 && answeredNumber <= 2) 

std::cin與>>操作員接收格式化數據,您將需要使用get()等功能接收格式化數據。

+0

不能'獲得'_character_然後將其轉換爲整數?我想你可能需要把它變成一個真正的價值(例如通過減去'0')。 – paxdiablo

+0

@paxdiablo:是的,你是對的,我沒有意識到這一點。 –