C++のstoi関数をマスター!完全解説と実践例5選 – JPSM

C++のstoi関数をマスター!完全解説と実践例5選

C++のstoi関数を徹底解説するイメージC++

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

このサービスは複数のSSPによる協力の下、運営されています。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

また、理解しにくい説明や難しい問題に躓いても、JPSMがプログラミングの解説に特化してオリジナルにチューニングした画面右下のAIアシスタントに質問していだければ、特殊な問題でも指示に従い解決できるように作ってあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

C++を学ぶ上で避けて通れないのが型変換の技術です。

特に文字列から整数への変換は、多くのプログラムで必要とされる基本的な操作です。

この記事では、C++の基本関数の一つである「stoi関数」に焦点を当て、その使い方から応用例までを詳細に解説します。

C++初心者から経験豊富なプログラマーまで、すべての方がstoi関数の全容を理解し、実際のプログラムで活用できるようになることが目標です。

この記事を通じて、C++における型変換の基礎知識を身につけ、より高度なプログラミング技術への扉を開いていきましょう。

●C++とstoi関数の基本

C++は、高性能なソフトウェア開発を可能にする汎用プログラミング言語です。

多くの場面で利用されるC++では、データ型を変換する操作が頻繁に行われます。

例えば、ユーザーからの入力を受け取ったり、ファイルからデータを読み込む際に、それらのデータが文字列として扱われることがよくあります。

しかし、計算を行う際などは、これらの文字列を整数や浮動小数点数に変換する必要があります。

stoi関数は、C++の標準ライブラリに含まれる関数で、文字列(string)を整数(int)に変換するために使用されます。

この関数は、std::string型の文字列を引数として受け取り、その文字列を整数に変換して返します。

特にデータの入力やパースを行う際に非常に便利で、C++プログラミングの基礎として覚えておくべき関数の一つです。

○stoi関数とは?

stoi関数は、「string to integer(文字列から整数へ)」の略で、その名の通り、文字列を整数に変換する関数です。

std::string型や文字列リテラルを整数型の値に変換する際に使用され、非常にシンプルで直感的な構文を持っています。

これにより、プログラマーは複雑な型変換の処理を簡単に記述することができます。

○stoi関数の基本構文

stoi関数の基本的な構文は下記のようになります。

int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);

この関数は、最初の引数として変換したい文字列を取ります。

二番目の引数はオプショナルで、変換が終了した文字の位置を表すインデックスを格納するためのポインタを指定します。

この引数は必須ではありませんが、特定の文字以降の数値を変換したい場合などに便利です。

最後の引数は、数値の基数を指定します。デフォルトは10進数ですが、16進数や8進数など他の基数での変換も可能です。

stoi関数は、指定された文字列を整数に変換し、その結果を返します。

ただし、文字列が有効な整数表現でない場合や、変換した結果がint型で扱える範囲を超える場合は、例外を投げることがあります。

そのため、stoi関数を使用する際には、適切なエラーハンドリングを行うことが重要です。

stoi関数は、C++11から導入された機能の一つで、以前のC++標準では利用できませんでした。

C++11以降の標準をサポートする環境であれば、この関数を利用することができます。

現代のC++プログラミングでは、多くの場合、この新しい標準に基づいてコードが書かれるため、stoi関数の理解は非常に重要です。

●stoi関数の使い方

C++におけるstoi関数の使い方を理解することは、文字列から数値への変換を扱う上で非常に重要です。

ここでは、基本的な数値変換の方法から始めて、文字列に含まれる数値の抽出、さらにはエラー処理の実装について解説していきます。

これらの各ステップにおいて、具体的なサンプルコードとその詳細な解説を提供します。

○サンプルコード1:基本的な数値変換

まず、stoi関数を使用して基本的な文字列から整数への変換を行う方法を見ていきましょう。

下記のサンプルコードは、文字列”1234″を整数に変換する基本的な例です。

#include <iostream>
#include <string>

int main() {
    std::string str = "1234";
    int num = std::stoi(str);
    std::cout << "変換された数値: " << num << std::endl;
    return 0;
}

このコードでは、まず文字列”1234″をstd::string型の変数strに格納しています。

次に、std::stoi関数を用いてこの文字列を整数に変換し、整数型の変数numに格納しています。

最後に、変換された数値を標準出力に表示しています。

この例では、文字列”1234″が整数の1234に正しく変換されて出力されることがわかります。

○サンプルコード2:文字列に含まれる数値の抽出

次に、文字列の中から特定の数値のみを抽出して変換する方法を見ていきましょう。

下記のサンプルコードでは、文字列の中に含まれる数値の一部を整数に変換しています。

#include <iostream>
#include <string>

int main() {
    std::string str = "商品の個数は1234個です";
    std::size_t pos;
    int num = std::stoi(str, &pos);
    std::cout << "抽出された数値: " << num << ", 位置: " << pos << std::endl;
    return 0;
}

このコードでは、std::stoi関数の第二引数にポインタ&posを渡すことで、数値が抽出された後の文字列の位置を取得しています。

この例では、”商品の個数は1234個です”という文字列から1234という数値が抽出され、その位置が出力されます。

この方法を使うことで、文字列の特定の部分にある数値だけを簡単に取り出すことが可能になります。

○サンプルコード3:エラー処理の実装

C++において、stoi関数を使用する際は、文字列が有効な整数形式でない場合や変換結果が整数型の範囲を超える場合にエラーが発生する可能性があります。

このようなエラーに対処するためには、例外処理を適切に実装することが重要です。

下記のサンプルコードでは、stoi関数のエラー処理を実装した例を表しています。

#include <iostream>
#include <string>
#include <stdexcept>

int main() {
    try {
        std::string str = "abc";
        int num = std::stoi(str);
        std::cout << "変換された数値: " << num << std::endl;
    } catch (const std::invalid_argument& e) {
        std::cout << "無効な引数エラー: " << e.what() << std::endl;
    } catch (const std::out_of_range& e) {
        std::cout << "範囲外エラー: " << e.what() << std::endl;
    }

    return 0;
}

このコードでは、tryブロック内でstoi関数を用いて文字列から整数への変換を試みています。

しかし、文字列"abc"は整数に変換できないため、std::invalid_argument例外が発生します。

この例外はcatchブロックで捕捉され、エラーメッセージが出力されます。

同様に、変換結果が整数型の範囲を超える場合にはstd::out_of_range例外が発生します。

●stoi関数の応用例

C++でのプログラミングでは、単に文字列を整数に変換するだけでなく、より複雑なシナリオでstoi関数を応用することがあります。

ここでは、入力検証と例外処理、さらには応用的なデータ変換に関する具体的なサンプルコードを通じて、stoi関数の応用例を解説します。

○サンプルコード4:入力検証と例外処理

プログラムにおいてユーザーからの入力を受け取る際、不正確または不適切な入力を適切に処理することが重要です。

下記のサンプルコードでは、ユーザーからの入力を検証し、適切に例外処理を行う方法を表しています。

#include <iostream>
#include <string>
#include <stdexcept>

int main() {
    std::string input;
    std::cout << "整数を入力してください: ";
    std::cin >> input;

    try {
        int num = std::stoi(input);
        std::cout << "入力された数値: " << num << std::endl;
    } catch (const std::invalid_argument& e) {
        std::cout << "エラー: 数値ではない入力がされました。" << std::endl;
    } catch (const std::out_of_range& e) {
        std::cout << "エラー: 入力された数値が大きすぎます。" << std::endl;
    }

    return 0;
}

このコードでは、ユーザーが入力した文字列が数値に変換できない場合や、変換された数値がint型の範囲を超えている場合に、適切な例外処理を行っています。

これにより、プログラムは不正確な入力に対しても適切に対応できるようになります。

○サンプルコード5:応用的なデータ変換

stoi関数は、より複雑なデータ処理のシナリオにも応用することができます。

下記のサンプルコードでは、複数の数値が含まれる文字列から、特定の条件を満たす数値のみを抽出して処理する方法を表しています。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

int main() {
    std::string data = "42, 1024, 23, 512";
    std::stringstream ss(data);
    std::string token;
    std::vector<int> numbers;

    while (std::getline(ss, token, ',')) {
        try {
            int num = std::stoi(token);
            if (num > 100) {
                numbers.push_back(num);
            }
        } catch (...) {
            continue;
        }
    }

    std::cout << "100より大きい数値: ";
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

このコードでは、カンマで区切られた数値のリストから、100より大きい数値のみを抽出しています。

文字列ストリームを使用してデータをトークン化し、各トークンをstoi関数で整数に変換しています。

変換された数値が条件を満たす場合に限り、それを数値のベクターに追加しています。

●stoi関数に関するよくあるエラーと対処法

stoi関数を使用する際には、特定のエラーが発生する可能性があります。

これらのエラーを理解し、適切に対処することが重要です。

ここでは、C++のstoi関数で頻繁に遭遇するエラーの種類とその対処法について詳細に解説します。

○無効な引数のエラー

stoi関数に無効な引数が渡された場合、std::invalid_argument例外がスローされます。

無効な引数とは、数値に変換できない文字列を指します。

例えば、全く数字を含まない文字列や、数字と数値に変換できない文字が混在する場合です。

この例外が発生した場合、プログラムは即座に終了するのではなく、エラーメッセージを出力して適切に処理を続行することが望ましいです。

下記のサンプルコードは、無効な引数が渡されたときのエラー処理の例を表しています。

#include <iostream>
#include <string>
#include <stdexcept>

int main() {
    std::string str = "非数値文字列";
    try {
        int num = std::stoi(str);
        std::cout << "変換された数値: " << num << std::endl;
    } catch (const std::invalid_argument& e) {
        std::cout << "エラー: 無効な引数 - " << e.what() << std::endl;
    }
    return 0;
}

このコードでは、tryブロック内でstoi関数を呼び出し、例外std::invalid_argumentが捕捉された場合、エラーメッセージが出力されます。

○範囲外の値のエラー

範囲外の値のエラーは、変換しようとする数値がint型の範囲を超える場合に発生します。

このような場合、std::out_of_range例外がスローされます。範囲外の数値が渡されたときにこの例外を適切に処理することで、プログラムの安全性を高めることができます。

下記のサンプルコードでは、範囲外の値が渡されたときのエラー処理を表しています。

#include <iostream>
#include <string>
#include <stdexcept>

int main() {
    std::string str = "2147483648"; // int型の範囲を超える値
    try {
        int num = std::stoi(str);
        std::cout << "変換された数値: " << num << std::endl;
    } catch (const std::out_of_range& e) {
        std::cout << "エラー: 範囲外の値 - " << e.what() << std::endl;
    }
    return 0;
}

このコード例では、int型の最大値を超える数値をstd::stoi関数に渡し、std::out_of_range例外が発生した場合の処理を実装しています。

このように、stoi関数を使う際には、適切なエラーハンドリングを行うことが重要です。

●エンジニアなら知っておくべきstoi関数の豆知識

C++を扱うエンジニアとして、stoi関数だけでなく、それに関連する様々な知識も把握しておくことが重要です。

ここでは、stoi関数と密接に関連するstd::stringクラスの使い方や、stoi関数に似た他の関数について解説します。

これらの知識を身につけることで、より柔軟かつ効率的なプログラミングが可能になります。

○豆知識1:stoi関数とstd::stringの関係

stoi関数はstd::string型の文字列を引数として取ります。

std::stringはC++標準ライブラリの一部で、文字列をより安全かつ便利に扱うことができるクラスです。

std::stringを使うことで、文字列の連結、検索、切り出しといった操作を簡単に行うことができます。

例えば、ユーザーからの入力をstd::string型で受け取り、それをstoi関数で整数に変換するという処理は非常に一般的です。

std::stringは動的なメモリ管理を行うため、Cスタイルの文字列(char型の配列)を使うよりも安全で、メモリリークのリスクも少なくなります。

○豆知識2:stoiと関連関数

stoi関数は、文字列を整数に変換する関数ですが、C++標準ライブラリには他にも類似の関数が存在します。

例えば、「stol」や「stoll」はそれぞれlong型やlong long型の整数に変換する関数で、大きな数値を扱う際に使用します。

また、「stof」や「stod」は浮動小数点数に変換するための関数で、それぞれfloat型とdouble型の値を生成します。

これらの関数もstoiと同様に、無効な文字列が与えられた場合には例外を投げるため、適切なエラーハンドリングが必要です。

これらの関数を使い分けることで、様々なデータタイプの変換処理を柔軟に対応することができます。

まとめ

この記事では、C++の基本的な機能であるstoi関数の使い方から応用例、よくあるエラーとその対処法までを詳しく解説しました。

初心者から上級者までが理解しやすいように、実践的なサンプルコードを用いながら、型変換の基本からエラーハンドリングの重要性までを幅広くカバーしました。

この記事を通じて、C++での効果的なデータ操作とプログラミングスキルの向上に役立つ知識を得ることができたはずです。