2012-02-26 178 views
0

我承認並不是C++最有經驗的人,但對於讓這樣一個簡單的函數正常工作時遇到問題感到驚訝。我想要的一個功能是獲取用戶的輸入並確保它獲得一個整數(不會因意外輸入而崩潰),然後將該值返回給調用函數。它不應該接受任何特殊的字符或空格。從本質上講,我希望它就像相當於Java,我會在下面發佈:C + + getInt()函數(附加一個Java等效函數)

public static int getInt() 
{ 
    boolean isNum = false; //test variable 
    String str; //to hold input 

    do 
    { 
     str = keyboard.nextLine(); 
     if (!(isNum = str.matches("\\d+"))) 
     { 
      System.out.println("Enter a valid whole number, try again."); 
     } 
    } while(!isNum); 

    return Integer.parseInt(str); 
} 
+4

你面對的具體問題是什麼? (也就是「我們不會爲你寫代碼」)。 – 2012-02-26 17:51:28

+0

cin >> intValue;不適合你? – 2012-02-26 17:52:40

+0

使用cin >> int;工作....只要輸入預期的輸入。如果我輸入文字字符,我會陷入無限循環,這正是我想要避免的。 – 2012-02-26 18:01:16

回答

2

你只是試圖讀取cin >> [int variable]int,並確保它成功了。如果沒有,洗,漂洗,重複:

int i; 

while (!(cin >> i)) { 
    cout << "Enter a valid integer, try again: "; 
    cin.clear(); 
    cin.ignore(std::numeric_limits<int>::max(), '\n'); 
} 

return i; 

,將工作,但給定的輸入時一樣

,因爲它會讀取12和返回12停在a。如果您不想「儘可能地多」,並且想要閱讀整行(這是Java代碼片段顯然會這樣做),那麼您可以使用std::getline並嘗試將結果字符串轉換爲與std::stoi一致的整數:

string line; 
int integer = 0; 

while (std::getline(cin, line)) 
    try { 
     integer = std::stoi(line); 
     break; 
    } catch (...) { 
     cout << "Enter an integer, try again: "; 
    } 

return integer; 

這樣會輸入不回報像

143 BBC

,因爲它會嘗試將整條生產線轉換143 bbc爲一個整數,並告訴用戶再次嘗試,因爲bbc不能轉換爲整數。它只會在整行是整數輸入時纔會返回。

你可以通過像Java例子那樣使用regexen來實現這個目標,但是我認爲爲這個簡單任務抽出正則表達式是一種浪費。

編輯:

如果你想拒絕的,而不是截斷它小數點輸入,可以將輸入轉化爲double和檢查,以確保它不會有一個小數部分:

string line; 
double d = 0; 

while (std::getline(cin, line)) 
    try { 
     d = std::stod(line); 

     if (std::fmod(d, 1) != 0) 
      throw 0; 

     break; 
    } catch (...) { 
     cout << "Enter an integer, try again: "; 
    } 

return d; 
+0

感謝您的回覆。你列出的第二個代碼塊基本上是我想要的。它可以捕捉任何字母輸入並防止無限循環。我現在看到的唯一問題是,當我輸入一個十進制類型的數字時,它將接受該輸入並截斷小數部分,而不是獲取新的輸入。我會試着找出問題出在哪裏......我認爲它可能是stoi函數的東西,我必須通過它的庫文檔來查看它。 – 2012-02-26 18:09:47

+0

@ R.Brown使用'std :: stod'將它轉換爲double,如果成功,則在返回時將其轉換爲'int',並將截斷它。 – 2012-02-26 18:11:56

+0

它已經截斷它。我打算它拒絕小數輸入或真正的東西,而不是以整數格式輸入。 – 2012-02-26 18:17:41