2012-02-26 17 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

あなたが直面している*具体的な問題は何ですか? (別名「あなたのためのコードを書くだけではありません」)。 –

+0

cin >> intValueについてはどうですか;あなたのために働かないのですか? –

+0

cin >> intを使用しています。予想される入力が入力されている限り、動作します。私がテキスト文字を入力すると、私は無限ループに陥ります。これは私が避けようとしているものです。 –

答えて

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で停止してください。あなたができるだけ多くのものを取得したくない場合は、std::getlineを使用して、結果の文字列をstd::stoiの整数に変換しようとします(Javaのコードが明らかにそうです)。

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

返事をありがとう。リストした2番目のコードブロックは基本的に私が望むものです。任意の文字が入力されたときにキャッチし、無限ループを防止します。私が今見ている唯一の問題は、入力を受け入れ、新しい入力を得る代わりに小数部分を切り捨てる小数点型の数値を入れたときです。私は試してみて、そこに何が問題なのか把握しようとしています...私はそれがおそらく関数であると仮定しています。ライブラリのドキュメンテーションを調べなければなりません。 –

+0

@ R.Brownは 'std :: stod'を代わりに使ってdoubleに変換し、成功した場合は返すときに' int'にキャストします。これはそれを切り捨てます。 –

+0

すでに切り詰めてあります。私は小数点の入力を拒否しようとしていますが、実際には整数形式で入力されていないものは拒否しています。 –