この記事では、C++プログラムを実行した際に発生した ‘std::out_of_range’ エラーについて解説し、どのように解決するかを説明します。特に、basic_string::substr メソッドに関連したエラーについて詳しく見ていきます。
1. エラーの内容
エラーメッセージは以下のようになっています:terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr: __pos (which is 144) > this->size() (which is 74)
このエラーは、文字列のインデックスが範囲外である場合に発生します。具体的には、substr メソッドが引数に指定された位置が文字列の長さを超えている場合に起こります。
2. エラーの原因
コードの問題は、文字列の一部を切り出す際に不正なインデックスを指定している点にあります。関数 split の中で、文字列 str が更新されていく際に、substr(0, i) が無限ループのように呼ばれ、インデックスが文字列の長さを超えてしまっています。
3. 解決方法
エラーを解決するには、文字列の更新方法を見直す必要があります。現在のコードでは、文字列の先頭からインデックス i までの部分文字列を取り出した後、元の文字列を更新する処理で問題が発生しています。
以下のように、文字列の分割を行う部分を修正することで、エラーを回避できます。
std::vector split(std::string& str, char sep) {
std::vector a;
size_t n = str.size();
size_t last_pos = 0;
for (size_t i = 0; i < n; i++) {
if (str[i] == sep) {
a.push_back(str.substr(last_pos, i - last_pos));
last_pos = i + 1;
}
}
if (last_pos < n) {
a.push_back(str.substr(last_pos));
}
return a;
}
4. コードの改良
この修正では、文字列を分割する際に、last_pos を追跡して、分割すべき位置を明確にしています。これにより、エラーが発生することなく、正常に文字列を分割できるようになります。
5. まとめ
C++プログラムで発生する std::out_of_range エラーは、基本的に不正なインデックスによる問題です。このようなエラーを解決するためには、文字列操作時のインデックス管理を正確に行い、範囲外のアクセスを防ぐようにします。今回紹介した方法を参考に、エラーを修正し、正常にプログラムを動作させましょう。


コメント