Closed5
GLIBCXX_DEBUG が捕捉できないエラーがある?
#define _GLIBCXX_DEBUG
#include <iostream>
using namespace std;
int main(void){
string s = "abc";
s[1] = s[3];
return 0;
}
s[3]
は境界外なので普通ならエラーの事案だと思った。
.at()
を使うとエラーになる。
#include <iostream>
using namespace std;
int main(void){
string s = "abc";
s.at(1) = s.at(3);
return 0;
}
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at: __n (which is 3) >= this->size() (which is 3)
string は厳密には配列じゃないとかそういうことかな。。
#define _GLIBCXX_DEBUG
#include <iostream>
using namespace std;
int main(void){
string s1 = "abc";
s1[1] = s1[3];
cout << s1 << endl;
return 0;
}
ac
末尾に見えない何かがあるのかな...
FYI: C++標準ライブラリの文字列クラスstd::string
では、s[s.size()]
は'\0'
を返すと保証されていますね。つまりs1[1] = s1[3];
後はs == {'a', '\0', 'c', '\0'}
(size=3) となります。
これは、NUL文字('\0'
)終端されるC文字列への変換を容易にする措置(の副作用)でそうなっています。
ありがとうございます!勉強になりました
このスクラップは2021/06/27にクローズされました