C++ で入力が整数かどうかを確認する

胡金庫 2023年10月12日
  1. C++ で std::find_if アルゴリズムを使用して入力が整数かどうかを確認する
  2. C++ で std::string::find_first_not_of 関数を使用して入力が整数かどうかを確認する
  3. C++ で std::string::find_first_not_of 関数を使用して入力が整数かどうかを確認する
C++ で入力が整数かどうかを確認する

この記事では、入力が 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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Integer