2017-10-23 11 views
0

現在、コード内に整数の検証ループを作成する際に問題が発生しています。C++整数の検証

文字列 '22a'を入力すると、このコードは正常に動作しませんが、たとえば '22a'という文字列を入力すると、trial_noは22となります。すべての文字入力が実際には文字列であることを確認する方法はありますか'22a'または '2a2'は誤っているとみなされ、ループは有効な整数が入力されるまで続きますか?

int trial_no; 

bool valid = false; 

while(!valid) 
{ 
    valid = true; //assume trial_no will be an integer 
    cout << "Enter the number of die throws to simulate" << endl; 
    cin >> trial_no; 

    if(cin.fail()) // exit loop condition is dependent on trail_no being a valid integer 
    { 
     cin.clear(); //corrects stream 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); //skips left over stream data (numeric_limit 
     // is in case user enters more than one letter)) 
     cout << "Please enter an integer value" << endl; 
     valid = false; //cin not an integer so loop goes round to try again 
    } 
} 
+3

がのstd ::文字列としてそれを読んで、その後、整数に変換します。変換に失敗した場合は、整数ではありません。 –

+0

[C++文字列がintかどうかを確認するにはどうすればよいですか?](https://stackoverflow.com/questions/2844817/how-do-i-check-if-ac-string-is-an-int ) – user2891462

答えて

1

間違いなく最良の方法は、文字列として行全体を読んで、std::stoi機能を利用することである。

#include <iostream> 
#include <string> 
int main() { 
    std::cout << "Enter an integer: "; 
    std::string tempstr; 
    bool valid = false; 
    std::getline(std::cin, tempstr); 
    try { 
     int result = std::stoi(tempstr); 
     std::cout << "The result is: " << result; 
     valid = true; 
    } 
    catch (std::invalid_argument) { 
     std::cout << "Could not convert to integer."; 
     valid = false; 
    } 
} 

コメントで指摘したように、この機能はまた、std::out_of_range例外をスローすることができます。これは、コンパイラがC++ 11(+)対応であることを前提としています。ない場合は、std::stringstreamルートを下る:

std::string tempstr; 
std::getline(std::cin, tempstr); 
std::stringstream ss(tempstr); 
int result; 
bool valid = false; 
if (ss >> result) { 
    valid = true; 
} 
else { 
    valid = false; 
} 
+1

'std :: stoi'も' std :: out_of_range'例外をスローする可能性があるので注意してください。さらに、処理される文字数を取得してベースを渡すと便利です。 –

+1

@Bob__確かに。私は答えを更新しました。 – Ron

+0

ストーリーの "22a"の出力がまだ22なので、これは実際には答えません。 – xyious