C++でstringをintに変換するには、いくつかの方法があります。
もっとも一般的で分かりやすいのは、std::stoi()を使う方法です。
std::stringに入っている"123"のような文字列は、見た目は数字でも、そのままでは数値計算に使えるint型ではありません。
計算や比較に使いたい場合は、文字列を整数に変換する必要があります。
C++では、用途に応じて次のような方法が使われます。
std::stoi()を使う方法std::stringstreamを使う方法std::atoi()を使う方法std::from_chars()を使う方法
基本的には、初心者や一般的な用途であればstd::stoi()を使うのが分かりやすくおすすめです。
std::stoi()を使う方法
std::stoi()はstringをintに変換する標準的な方法
std::stoi()は、文字列を整数に変換するための標準関数です。
例えば、"123"という文字列を123という整数に変換できます。
C++でstringをintに変換したい場合、まず覚えておきたいのがこの方法です。
std::stoi()は書き方がシンプルで、読みやすいため、初心者にも扱いやすい変換方法です。
負の数も変換できる
std::stoi()は、正の整数だけでなく、負の整数にも対応しています。
例えば、"-456"のような文字列は、整数の-456として変換できます。
そのため、ユーザー入力やファイルから読み込んだ値にマイナスが含まれている場合でも、基本的には問題なく扱えます。
先頭の空白は無視される
std::stoi()は、文字列の先頭に空白がある場合でも、その空白を無視して変換できます。
例えば、" 789"のように数字の前にスペースが入っていても、整数の789として変換されます。
ただし、これはあくまで先頭の空白についてです。
文字列全体が正しい整数かどうかを厳密に確認したい場合は、別途チェックが必要になります。
std::stoi()を使うときの注意点
数字の後ろに文字がある場合は途中まで変換される
std::stoi()を使うときに特に注意したいのが、文字列の途中まで変換できる場合です。
例えば、"123abc"のような文字列を変換すると、エラーになるのではなく、先頭の123だけが整数として変換されます。
つまり、std::stoi()は文字列全体が整数として正しいかどうかを自動で判定してくれるわけではありません。
この点は、初心者が誤解しやすい部分です。
"123abc"のような文字列を不正な入力として扱いたい場合は、変換後に「どこまで変換できたか」を確認する必要があります。
小数の文字列は小数点の前まで変換される
"123.45"のような文字列をstd::stoi()で変換すると、結果は123になります。
これは、小数を四捨五入しているわけではありません。
単に、整数として読み取れる部分が123までなので、そこで変換が止まっているだけです。
そのため、小数を正しく扱いたい場合は、intではなくdoubleなどの浮動小数点型に変換する必要があります。
小数を整数にしたい場合も、目的に応じて切り捨て、四捨五入、切り上げなどを明確に決めて処理することが大切です。
変換できない文字列では例外が発生する
std::stoi()に、数字として解釈できない文字列を渡すと例外が発生します。
例えば、"abc"のような文字列は整数に変換できません。
このような場合、std::invalid_argumentという例外が発生します。
また、文字列が数字としては読めても、int型で扱える範囲を超えている場合は、std::out_of_rangeという例外が発生します。
そのため、ユーザー入力や外部ファイルの内容を変換する場合は、例外処理を行うことが重要です。
intの範囲を超える数値には注意する
intには扱える数値の範囲があります。
非常に大きな数値や非常に小さな数値が文字列として渡された場合、intに収まらないため、変換に失敗します。
例えば、桁数が非常に多い数値は、見た目は数字だけで構成されていても、intとして扱えない可能性があります。
このような場合は、longやlong longへの変換を検討する必要があります。
文字列全体が整数か確認することが大切
std::stoi()だけでは完全な入力チェックにならない
std::stoi()は便利ですが、文字列全体が整数かどうかを確認する用途では、そのままだと不十分な場合があります。
例えば、次のような文字列を考えると分かりやすいです。
"123"は整数として正しい文字列です。
一方で、"123abc"は整数としては不自然な文字列です。
しかし、std::stoi()では先頭の123だけが変換されるため、単純に変換結果だけを見ると問題がないように見えてしまいます。
そのため、入力値を厳密にチェックしたい場合は、変換できたかどうかだけでなく、文字列の最後まで正しく変換されたかを確認する必要があります。
末尾の空白を許可するかどうかも決めておく
文字列全体をチェックする場合は、末尾の空白をどう扱うかも考える必要があります。
例えば、"123"だけを正しい整数として扱うのか、それとも"123 "のように後ろにスペースがある場合も許可するのかによって、チェック方法が変わります。
厳密に「数字だけ」を許可したい場合は、末尾の空白も不正として扱ってよいでしょう。
一方、ユーザーが入力した文字列を扱う場合は、前後の空白を許容した方が自然なこともあります。
記事やプログラムの目的に応じて、どこまでを正しい入力として認めるのかを明確にしておくことが大切です。
stringstreamを使って変換する方法
stringstreamでもstringをintに変換できる
std::stringstreamを使って、stringをintに変換することもできます。
stringstreamは、文字列をストリームとして扱う仕組みです。
文字列から値を順番に読み取ることができるため、整数だけでなく、複数の値を含む文字列を処理したい場合にも使われます。
例えば、空白で区切られた複数の数値を順番に取り出したい場合などには、stringstreamが便利です。
stringstreamは複数の値を扱うときに便利
std::stoi()は、基本的に1つの文字列を1つの整数に変換する場面で使いやすい方法です。
一方、stringstreamは、1つの文字列の中に複数の値が含まれている場合に向いています。
例えば、"10 20 30"のような文字列から、順番に10、20、30を取り出したい場合には、stringstreamが使いやすいです。
stringstreamも途中まで変換できる点に注意
stringstreamも、文字列全体が整数として正しいかどうかを自動で厳密に判定してくれるわけではありません。
例えば、"123abc"のような文字列でも、先頭の123だけを読み取って変換が成功する場合があります。
そのため、stringstreamを使う場合でも、文字列全体が正しい整数かどうかを確認したいときは、余分な文字が残っていないかをチェックする必要があります。
atoiを使う方法
atoiはC言語由来の変換方法
atoi()は、C言語由来の文字列変換関数です。
C++でも使うことはできますが、現在のC++では積極的にはおすすめされません。
atoi()を使う場合、std::stringをそのまま渡すのではなく、C言語形式の文字列に変換してから使う必要があります。
古いコードやC言語寄りのコードでは見かけることがありますが、新しくC++のコードを書く場合は、基本的にstd::stoi()やstd::from_chars()を使う方が安全です。
atoiは失敗したかどうかが分かりにくい
atoi()の大きな問題は、変換に失敗した場合の判定が分かりにくいことです。
例えば、"abc"のような文字列を変換すると、結果として0が返ることがあります。
しかし、もともとの文字列が"0"だった場合も、結果は0です。
つまり、atoi()では「正しく0に変換できた」のか、「変換に失敗して0になった」のかを区別しにくいという問題があります。
範囲外の値にも注意が必要
atoi()は、変換結果がintの範囲を超える場合にも安全に扱いにくいという問題があります。
std::stoi()であれば、範囲外の値に対して例外を発生させることができます。
しかし、atoi()ではエラーを明確に扱いにくいため、予期しない動作につながる可能性があります。
そのため、初心者向けの記事では、atoi()は「古い方法として存在するが、基本的にはおすすめしない」と説明するのがよいでしょう。
std::from_charsを使う方法
std::from_charsはC++17以降で使える
std::from_chars()は、C++17以降で使える変換関数です。
文字列を数値に変換するための機能で、intへの変換にも使えます。
std::from_chars()の特徴は、例外を投げないことと、処理が高速であることです。
そのため、大量の文字列を数値に変換するような処理では、std::stoi()よりも向いている場合があります。
std::from_charsは例外を使わない
std::stoi()は、変換に失敗したときに例外を投げます。
一方、std::from_chars()は例外を投げず、変換結果を戻り値で判断します。
例外処理を避けたい場合や、パフォーマンスを重視したい場合には、std::from_chars()が有力な選択肢になります。
std::from_charsは先頭の空白を無視しない
std::from_chars()を使うときに注意したいのは、std::stoi()とは挙動が違う点です。
std::stoi()は、文字列の先頭にある空白を無視して変換できます。
しかし、std::from_chars()は、先頭の空白を自動では無視しません。
そのため、" 123"のように先頭に空白がある文字列をそのまま変換しようとすると、変換に失敗する場合があります。
ユーザー入力を扱う場合は、必要に応じて事前に空白を取り除く処理が必要です。
初心者には少し難しいが実務では便利
std::from_chars()は高速で便利ですが、std::stoi()に比べると書き方が少し複雑です。
そのため、C++を学び始めたばかりの段階では、まずstd::stoi()を理解するのがおすすめです。
一方で、競技プログラミング、大量データの解析、ログ処理、パフォーマンスが重要なアプリケーションなどでは、std::from_chars()が役立ちます。
各変換方法の使い分け
一般的な用途ならstd::stoi()
通常のC++プログラムで、単純にstringをintに変換したい場合は、std::stoi()を使うのが分かりやすいです。
書き方が簡単で、例外によって変換失敗も扱えるため、初心者にも向いています。
ただし、"123abc"のような文字列を途中まで変換してしまう点には注意が必要です。
文字列全体が整数かどうかを確認したい場合は、追加のチェックを行いましょう。
複数の値を読み取りたいならstringstream
1つの文字列の中に複数の数値が含まれている場合は、stringstreamが便利です。
空白区切りの値を順番に読み取るような処理では、std::stoi()よりも自然に書けることがあります。
ただし、stringstreamも変換できる部分だけを読み取ることがあるため、厳密な入力チェックが必要な場合は注意が必要です。
新しいC++で高速処理したいならstd::from_chars
C++17以降を使える環境で、変換処理の速度を重視するなら、std::from_chars()が適しています。
特に、大量の数値文字列を扱う場合に有効です。
また、例外を使わずに変換結果を判定したい場合にも向いています。
ただし、std::stoi()と違って先頭の空白を無視しないなど、細かな挙動の違いがあります。
atoiは基本的に避ける
atoi()は古い方法であり、現在のC++では基本的に避けた方がよいです。
変換に失敗したかどうかが分かりにくく、範囲外の値も安全に扱いにくいためです。
既存の古いコードで見かけることはありますが、新しくコードを書く場合は、std::stoi()やstd::from_chars()を使う方がよいでしょう。
変換時に注意すべきポイント
入力が必ず数字とは限らない
ユーザー入力や外部ファイルのデータを扱う場合、文字列が必ず正しい数字であるとは限りません。
空文字、アルファベット、記号、空白、桁数が多すぎる数値など、さまざまな入力が考えられます。
そのため、単に変換するだけでなく、変換に失敗した場合の処理も用意しておく必要があります。
途中まで変換されるケースに注意する
std::stoi()やstringstreamでは、文字列の先頭部分だけが整数として変換される場合があります。
例えば、"100px"のような文字列を扱う場合、意図的に100だけ取り出したいなら便利です。
しかし、完全に整数だけを受け付けたい場合には、これは問題になります。
用途によって、「途中までの変換を許すのか」「文字列全体が整数でなければエラーにするのか」を決めておくことが大切です。
intの範囲を超える可能性を考える
文字列が数字だけで構成されていても、その数値がintの範囲に収まるとは限りません。
非常に大きな数値をintに変換しようとすると、変換に失敗する可能性があります。
扱う数値の範囲が大きい場合は、long、long long、または別の数値型を検討しましょう。
小数をintに変換する場合は意図を明確にする
"123.45"のような小数の文字列をintに変換する場合、std::stoi()では小数点の前までしか変換されません。
これは四捨五入ではありません。
小数を整数にしたい場合は、切り捨てるのか、四捨五入するのか、切り上げるのかを明確にする必要があります。
金額、割合、測定値などを扱う場合は、特に注意が必要です。
初心者におすすめの考え方
まずはstd::stoi()を覚える
C++でstringをintに変換する場合、最初に覚えるべきなのはstd::stoi()です。
シンプルで分かりやすく、一般的な用途では十分に使えます。
ただし、変換できない文字列や範囲外の数値では例外が発生するため、実際のプログラムでは例外処理を組み合わせて使うのが安全です。
入力チェックもセットで考える
文字列を整数に変換するときは、変換そのものだけでなく、入力チェックも大切です。
特に、ユーザーが入力した文字列や外部から読み込んだデータは、必ず正しい形式とは限りません。
そのため、次のような点を確認する必要があります。
- 数字として変換できるか
- 文字列全体が整数として正しいか
intの範囲に収まっているか- 小数や余分な文字をどう扱うか
- 空白を許可するか
これらを意識すると、より安全で実用的なプログラムになります。
目的に応じて方法を選ぶ
単純な変換であればstd::stoi()で十分です。
複数の値を文字列から取り出したいならstringstreamが便利です。
大量のデータを高速に処理したいならstd::from_chars()が向いています。
古いコードとの互換性がある場合を除き、atoi()はなるべく避けるのが無難です。
まとめ
C++でstringをintに変換する方法はいくつかありますが、基本的にはstd::stoi()を使うのがおすすめです。
std::stoi()は、文字列を整数に変換するための分かりやすい標準関数で、初心者にも扱いやすい方法です。
負の数や先頭の空白にも対応しており、一般的な用途では十分に使えます。
ただし、std::stoi()は"123abc"のような文字列をエラーにせず、先頭の123だけを変換する場合があります。
そのため、文字列全体が整数として正しいかどうかを確認したい場合は、追加のチェックが必要です。
また、変換できない文字列では例外が発生し、intの範囲を超える数値でもエラーになります。
ユーザー入力や外部データを扱う場合は、例外処理や入力チェックを行うことが大切です。
stringstreamは複数の値を文字列から取り出す場合に便利で、std::from_chars()はC++17以降で使える高速な変換方法です。
一方、atoi()は失敗判定が分かりにくいため、現在のC++では基本的におすすめしません。
初心者のうちは、まずstd::stoi()を使った変換を理解し、そのうえで必要に応じてstringstreamやstd::from_chars()を使い分けるとよいでしょう。
以上、C++でstringをintに変換する方法についてでした。
最後までお読みいただき、ありがとうございました。
