C++編で扱っている C++ は 2003年に登場した C++03
という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14
-> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++
の学習を始めるのなら、C++11
よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい
C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。
“100” や “-50” のような文字列を、整数型の値に変換したいとします。前者なら 100、後者なら -50 にします。
“100abc” のように、整数と関係がない文字が登場した場合、その手前までで打ち切ります。また、“abc100” の場合は、先頭部分が整数と関係がない文字なので、変換に失敗します。
C++11以降であれば、std::stoi関数があります。この関数は、C言語の strtol関数をラップしたもので、変換のエラーを、例外によって報告するようになっています。
#include <iostream>
#include <string>
int main()
{
try {
int v;
= std::stoi("100");
v std::cout << v << std::endl;
= std::stoi("-50");
v std::cout << v << std::endl;
= std::stoi("+50");
v std::cout << v << std::endl;
= std::stoi("0");
v std::cout << v << std::endl;
= std::stoi("100abc");
v std::cout << v << std::endl;
= std::stoi("abc100"); // 失敗する
v std::cout << v << std::endl;
}
catch (const std::invalid_argument& ex) {
std::cerr << ex.what() << std::endl;
}
catch (const std::out_of_range& ex) {
std::cerr << ex.what() << std::endl;
}
}
実行結果:
100
-50
50
0
100
invalid stoi argument
先頭の文字が数字でない場合のように、変換がまったく行われなかった場合は、std::invalid_argument例外が、変換結果が大きすぎたり、小さすぎたりして、表現できない場合は、std::out_of_range例外が送出されます。
また、strtol関数のように、変換できなかった最初の文字を得るための第2引数(strtol関数はポインタを使いますが、std::stoi関数は std::size_t型を使い文字数で表現されます)や、基数を指定する第3引数があります。これらの引数には、デフォルト実引数が設定されているため、上記サンプルプログラムのように、省略してしまっても動作します。
C++11 の機能が使えない場合は、std::istringstream を使います。
#include <iostream>
#include <sstream>
int main()
{
int v;
std::istringstream iss1("100");
>> v;
iss1 if (iss1) {
std::cout << v << std::endl;
}
std::istringstream iss2("-50");
>> v;
iss2 if (iss2) {
std::cout << v << std::endl;
}
std::istringstream iss3("+50");
>> v;
iss3 if (iss3) {
std::cout << v << std::endl;
}
std::istringstream iss4("0");
>> v;
iss4 if (iss4) {
std::cout << v << std::endl;
}
std::istringstream iss5("100abc");
>> v;
iss5 if (iss5) {
std::cout << v << std::endl;
}
std::istringstream iss6("abc100");
>> v;
iss6 if (iss6) {
std::cout << v << std::endl;
}
}
実行結果:
100
-50
50
0
100
>>演算子によって読み取りを行う際にエラーが起きた場合、ストリームの状態(【標準ライブラリ】第27章)が変化しています。「if (iss1)」のような判定によって、ストリームの状態が正常かどうか分かるので、これを使って、エラーが発生していないかどうかチェックしています。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |