文字列

[C++] 文字・文字列が数字かどうか判定する方法(整数/小数/指数表記)

C++で文字や文字列が数字かどうかを判定するには、以下の方法があります。

単一の文字の場合、標準ライブラリのstd::isdigitを使用できます。

文字列全体を判定する場合、std::regexを用いて正規表現で整数、小数、指数表記をチェックする方法が一般的です。

また、std::stodstd::stoiを使い、例外処理で判定する方法もあります。

単一文字が数字かどうかを判定する方法

C++では、単一の文字が数字であるかどうかを判定するために、isdigit関数を使用することができます。

この関数は、文字が数字(‘0’から’9’)であれば真(true)を返し、それ以外の場合は偽(false)を返します。

以下に、isdigit関数を用いたサンプルコードを示します。

#include <iostream>
#include <cctype> // isdigit関数を使用するために必要
int main() {
    char ch; // 判定する文字を格納する変数
    std::cout << "文字を入力してください: ";
    std::cin >> ch; // ユーザーからの入力を受け取る
    // isdigit関数を使って数字かどうかを判定
    if (isdigit(ch)) {
        std::cout << ch << " は数字です。" << std::endl; // 数字の場合の出力
    } else {
        std::cout << ch << " は数字ではありません。" << std::endl; // 数字でない場合の出力
    }
    return 0; // プログラムの正常終了
}
文字を入力してください: 5
5 は数字です。

このコードでは、ユーザーから入力された文字が数字かどうかを判定し、その結果を表示します。

isdigit関数を使うことで、簡単に判定が可能です。

文字列が整数かどうかを判定する方法

C++では、文字列が整数であるかどうかを判定するために、std::stoi関数を使用することが一般的です。

この関数は、文字列を整数に変換し、変換が成功した場合はその整数を返します。

変換に失敗した場合は、例外がスローされるため、例外処理を用いて判定を行います。

以下に、文字列が整数かどうかを判定するサンプルコードを示します。

#include <iostream>
#include <string> // std::stringを使用するために必要
#include <exception> // 例外処理のために必要
int main() {
    std::string input; // ユーザーからの入力を格納する変数
    std::cout << "整数を表す文字列を入力してください: ";
    std::cin >> input; // ユーザーからの入力を受け取る
    try {
        // std::stoiを使って文字列を整数に変換
        int number = std::stoi(input); 
        std::cout << input << " は整数です。" << std::endl; // 整数の場合の出力
    } catch (const std::invalid_argument& e) {
        // 変換に失敗した場合の処理
        std::cout << input << " は整数ではありません。" << std::endl; // 整数でない場合の出力
    } catch (const std::out_of_range& e) {
        // 範囲外の整数の場合の処理
        std::cout << input << " は範囲外の整数です。" << std::endl; // 範囲外の場合の出力
    }
    return 0; // プログラムの正常終了
}
整数を表す文字列を入力してください: 123
123 は整数です。

このコードでは、ユーザーから入力された文字列が整数に変換できるかどうかを判定し、その結果を表示します。

std::stoi関数を使用することで、簡単に整数判定が可能です。

また、例外処理を用いることで、無効な入力や範囲外の整数に対しても適切に対応できます。

文字列が小数かどうかを判定する方法

C++では、文字列が小数であるかどうかを判定するために、std::stof関数を使用することが一般的です。

この関数は、文字列を浮動小数点数に変換し、変換が成功した場合はその値を返します。

変換に失敗した場合は、例外がスローされるため、例外処理を用いて判定を行います。

以下に、文字列が小数かどうかを判定するサンプルコードを示します。

#include <iostream>
#include <string> // std::stringを使用するために必要
#include <exception> // 例外処理のために必要
int main() {
    std::string input; // ユーザーからの入力を格納する変数
    std::cout << "小数を表す文字列を入力してください: ";
    std::cin >> input; // ユーザーからの入力を受け取る
    try {
        // std::stofを使って文字列を浮動小数点数に変換
        float number = std::stof(input); 
        std::cout << input << " は小数です。" << std::endl; // 小数の場合の出力
    } catch (const std::invalid_argument& e) {
        // 変換に失敗した場合の処理
        std::cout << input << " は小数ではありません。" << std::endl; // 小数でない場合の出力
    } catch (const std::out_of_range& e) {
        // 範囲外の小数の場合の処理
        std::cout << input << " は範囲外の小数です。" << std::endl; // 範囲外の場合の出力
    }
    return 0; // プログラムの正常終了
}
小数を表す文字列を入力してください: 3.14
3.14 は小数です。

このコードでは、ユーザーから入力された文字列が小数に変換できるかどうかを判定し、その結果を表示します。

std::stof関数を使用することで、簡単に小数判定が可能です。

また、例外処理を用いることで、無効な入力や範囲外の小数に対しても適切に対応できます。

文字列が指数表記かどうかを判定する方法

C++では、文字列が指数表記(例えば、1.23e45.67E-8など)であるかどうかを判定するために、std::stofstd::stod関数を使用することが一般的です。

これらの関数は、文字列を浮動小数点数に変換し、変換が成功した場合はその値を返します。

変換に失敗した場合は、例外がスローされるため、例外処理を用いて判定を行います。

以下に、文字列が指数表記かどうかを判定するサンプルコードを示します。

#include <iostream>
#include <string> // std::stringを使用するために必要
#include <exception> // 例外処理のために必要
int main() {
    std::string input; // ユーザーからの入力を格納する変数
    std::cout << "指数表記を表す文字列を入力してください: ";
    std::cin >> input; // ユーザーからの入力を受け取る
    try {
        // std::stodを使って文字列を浮動小数点数に変換
        double number = std::stod(input); 
        std::cout << input << " は指数表記です。" << std::endl; // 指数表記の場合の出力
    } catch (const std::invalid_argument& e) {
        // 変換に失敗した場合の処理
        std::cout << input << " は指数表記ではありません。" << std::endl; // 指数表記でない場合の出力
    } catch (const std::out_of_range& e) {
        // 範囲外の数値の場合の処理
        std::cout << input << " は範囲外の数値です。" << std::endl; // 範囲外の場合の出力
    }
    return 0; // プログラムの正常終了
}
指数表記を表す文字列を入力してください: 1.23e4
1.23e4 は指数表記です。

このコードでは、ユーザーから入力された文字列が指数表記に変換できるかどうかを判定し、その結果を表示します。

std::stod関数を使用することで、簡単に指数表記の判定が可能です。

また、例外処理を用いることで、無効な入力や範囲外の数値に対しても適切に対応できます。

数字判定における正規表現の活用

C++では、正規表現を使用して文字列が数字であるかどうかを判定することができます。

正規表現を使うことで、整数、小数、指数表記など、さまざまな形式の数字を柔軟に判定することが可能です。

C++11以降、<regex>ヘッダを使用することで正規表現を扱うことができます。

以下に、正規表現を用いた数字判定のサンプルコードを示します。

#include <iostream>
#include <string> // std::stringを使用するために必要
#include <regex>  // 正規表現を使用するために必要
int main() {
    std::string input; // ユーザーからの入力を格納する変数
    std::cout << "数字を表す文字列を入力してください: ";
    std::cin >> input; // ユーザーからの入力を受け取る
    // 整数、小数、指数表記を判定する正規表現
    std::regex numberRegex(R"(^-?\d+(\.\d+)?([eE][-+]?\d+)?$)");
    // 正規表現にマッチするかどうかを判定
    if (std::regex_match(input, numberRegex)) {
        std::cout << input << " は数字です。" << std::endl; // 数字の場合の出力
    } else {
        std::cout << input << " は数字ではありません。" << std::endl; // 数字でない場合の出力
    }
    return 0; // プログラムの正常終了
}
数字を表す文字列を入力してください: -3.14e-10
-3.14e-10 は数字です。

このコードでは、ユーザーから入力された文字列が整数、小数、または指数表記の数字であるかどうかを正規表現を用いて判定します。

正規表現R"(^-?\d+(\.\d+)?([eE][-+]?\d+)?$)"は、以下の形式をサポートしています。

  • 整数(例: 123, -456)
  • 小数(例: 3.14, -0.001)
  • 指数表記(例: 1.23e4, 5.67E-8)

正規表現を使用することで、複雑な数字の形式を簡潔に判定することができます。

例外処理を用いた数字判定の実装

C++では、例外処理を用いて数字判定を行うことができます。

特に、std::stoistd::stofなどの関数を使用する際に、無効な入力や範囲外の数値に対して適切に対応するために例外処理が重要です。

以下に、例外処理を用いた数字判定のサンプルコードを示します。

#include <iostream>
#include <string> // std::stringを使用するために必要
#include <exception> // 例外処理のために必要
int main() {
    std::string input; // ユーザーからの入力を格納する変数
    std::cout << "整数または小数を表す文字列を入力してください: ";
    std::cin >> input; // ユーザーからの入力を受け取る
    try {
        // まず整数として判定
        int intValue = std::stoi(input); // 文字列を整数に変換
        std::cout << input << " は整数です。" << std::endl; // 整数の場合の出力
    } catch (const std::invalid_argument& e) {
        // 整数変換に失敗した場合
        try {
            // 小数として判定
            float floatValue = std::stof(input); // 文字列を浮動小数点数に変換
            std::cout << input << " は小数です。" << std::endl; // 小数の場合の出力
        } catch (const std::invalid_argument& e) {
            // 小数変換に失敗した場合
            std::cout << input << " は数字ではありません。" << std::endl; // 数字でない場合の出力
        } catch (const std::out_of_range& e) {
            // 小数が範囲外の場合
            std::cout << input << " は範囲外の小数です。" << std::endl; // 範囲外の場合の出力
        }
    } catch (const std::out_of_range& e) {
        // 整数が範囲外の場合
        std::cout << input << " は範囲外の整数です。" << std::endl; // 範囲外の場合の出力
    }
    return 0; // プログラムの正常終了
}
整数または小数を表す文字列を入力してください: 3.14
3.14 は小数です。

このコードでは、ユーザーから入力された文字列が整数または小数であるかどうかを判定します。

最初にstd::stoiを使用して整数に変換を試み、成功した場合は整数であると判断します。

もし変換に失敗した場合は、次にstd::stofを使用して小数に変換を試みます。

どちらの変換も失敗した場合は、入力が数字でないことを示します。

例外処理を用いることで、無効な入力や範囲外の数値に対しても適切に対応できるため、堅牢なプログラムを実現できます。

実用的な数字判定の実装例

ここでは、ユーザーからの入力を受け取り、その入力が整数、小数、または指数表記の数字であるかを判定する実用的なプログラムの例を示します。

このプログラムでは、正規表現を使用して多様な数字形式を判定し、例外処理を用いてエラーハンドリングを行います。

以下に、実装例を示します。

#include <iostream>
#include <string> // std::stringを使用するために必要
#include <regex>  // 正規表現を使用するために必要
#include <exception> // 例外処理のために必要
bool isNumber(const std::string& input) {
    // 整数、小数、指数表記を判定する正規表現
    std::regex numberRegex(R"(^-?\d+(\.\d+)?([eE][-+]?\d+)?$)");
    return std::regex_match(input, numberRegex); // 正規表現にマッチするか判定
}
int main() {
    std::string input; // ユーザーからの入力を格納する変数
    std::cout << "数字を表す文字列を入力してください: ";
    std::cin >> input; // ユーザーからの入力を受け取る
    if (isNumber(input)) {
        std::cout << input << " は数字です。" << std::endl; // 数字の場合の出力
    } else {
        std::cout << input << " は数字ではありません。" << std::endl; // 数字でない場合の出力
    }
    return 0; // プログラムの正常終了
}
数字を表す文字列を入力してください: -2.5e10
-2.5e10 は数字です。

このプログラムでは、isNumber関数を定義し、正規表現を使用して入力が数字であるかどうかを判定します。

正規表現R"(^-?\d+(\.\d+)?([eE][-+]?\d+)?$)"は、整数、小数、指数表記をサポートしています。

ユーザーからの入力を受け取り、その入力が数字であれば「数字です」と表示し、そうでなければ「数字ではありません」と表示します。

この実装例は、数字判定を行う際の基本的な構造を示しており、実際のアプリケーションにおいても応用可能です。

正規表現を使用することで、さまざまな形式の数字を柔軟に判定できるため、非常に便利です。

まとめ

この記事では、C++における文字や文字列が数字であるかどうかを判定する方法について詳しく解説しました。

具体的には、単一文字の判定から始まり、整数、小数、指数表記の判定方法、正規表現を用いた判定、例外処理を活用した実装、そして実用的な数字判定のプログラム例を紹介しました。

これらの知識を活用することで、C++プログラムにおける入力の検証をより堅牢に行うことができるでしょう。

ぜひ、実際のプロジェクトにおいてこれらの技術を試してみてください。

関連記事

Back to top button