C++ で入力が整数かどうかを確認する
-
C++ で
std::find_if
アルゴリズムを使用して入力が整数かどうかを確認する -
C++ で
std::string::find_first_not_of
関数を使用して入力が整数かどうかを確認する -
C++ で
std::string::find_first_not_of
関数を使用して入力が整数かどうかを確認する
この記事では、入力が C++ で整数であるかどうかを確認する方法に関する複数の方法を示します。
C++ で std::find_if
アルゴリズムを使用して入力が整数かどうかを確認する
std::find_if
は、<alogrithm>
ヘッダーファイルで定義された STL アルゴリズムライブラリの一部であり、範囲内の特定の要素を検索するために利用できます。ユーザー入力は文字列である可能性が高いため、入力データは std::string
オブジェクトに格納されていると想定します。std::string
への参照を取り、bool
値を返す isNumber
と呼ばれる関数を実装していることに注意してください。
次の例で使用した std::find_if
関数のプロトタイプは 3つの引数を取り、最初の 2つは範囲要素([first, last]
)を指定します。3 番目の引数は単項述語です。これは、isdigit
関数の反転値の評価から bool
値を返すラムダ関数です。式の true
値は数字以外の文字が見つからなかったことを示しているため、外層では、std::find_if
の戻り値が str.end()
と比較されます。したがって、それは数です。さらに、前の式と!str.empty
を論理的に AND して、文字列が空であることを示し、false
を返します。
#include <algorithm>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
bool isNumber(const string& str) {
return !str.empty() &&
std::find_if(str.begin(), str.end(), [](unsigned char c) {
return !std::isdigit(c);
}) == str.end();
}
int main() {
string str1 = "12345.";
string str2 = "12312";
string str3 = "123142.2";
isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";
exit(EXIT_SUCCESS);
}
出力:
Not number
Number
Not number
C++ で std::string::find_first_not_of
関数を使用して入力が整数かどうかを確認する
または、std::string
オブジェクトに組み込まれている find_first_not_of
メソッドを使用して isNumber
関数を再実装することもできます。find_first_not_of
は文字列値を取得し、文字列シーケンス内のどの文字とも等しくない最初の文字を見つけることができます。関数がそのような文字を見つけられない場合、string::npos
が返されます。したがって、10 進数すべてを find_first_not_of
引数として指定し、式の値が関数から返されるときに、npos
と等しいかどうかを確認します。
#include <algorithm>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
bool isNumber(const string& str) {
return str.find_first_not_of("0123456789") == string::npos;
}
int main() {
string str1 = "12345.";
string str2 = "12312";
string str3 = "123142.2";
isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";
exit(EXIT_SUCCESS);
}
出力:
Not number
Number
Not number
C++ で std::string::find_first_not_of
関数を使用して入力が整数かどうかを確認する
ただし、前の方法では実数を識別せず、それらを不正なものとして扱うことに注意してください。したがって、.
を追加できます。文字列に文字を追加し、関数がドット記号を含む数字のシーケンスを有効な数値として認識できるようにします。.
の場合、2つのケースを排除する必要があります。文字は入力シーケンスの最初と最後の記号であり、慣例により有効な実数ではありません。文字列組み込みメソッド front
および back
を使用して、入力がドット記号で開始/終了しないことを確認できます。最後に、3つの式すべてを論理的に AND して、その値を返します。
#include <algorithm>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
bool isNumber3(const string& str) {
return str.find_first_not_of(".0123456789") == string::npos &&
str.front() != '.' && str.back() != '.';
}
int main() {
string str1 = "12345.";
string str2 = "12312";
string str3 = "123142.2";
isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";
exit(EXIT_SUCCESS);
}
出力:
Not number
Number
Number