在遍历字符串时,为什么我没有超出范围错误,即使我已经超出了它的长度?

While iterating through a string, why am I NOT getting out of range error, even though I'm already beyond its length?

本文关键字:范围 字符串 遍历 为什么 错误      更新时间:2023-10-16

我的代码字面意思是这样的:

int main(){
string s = "Success!n";
for (int i=0; i<10; ++i) cout<<s[i];
return 0;
}

字符串 s 的长度为 8;即使我使用了超出字符串长度的迭代器"i",我也没有收到任何错误。为什么? 输出为:

Success!

使用换行符,我什至没有放置换行符

字符串 s 的长度为 8

不,不是,是9。

即使我使用了超出字符串长度的迭代器"i",我也没有收到任何错误

你没有超过字符串的长度,你等于字符串的长度。这被定义为返回空字符。即使您使用operator[]超出了字符串的长度,这也是未定义的行为,预计不会引发异常。

我什至没有放置换行符

。是的,你做到了。

根据字符串的下标(括号(运算符的定义:

char& operator[] (size_t pos(;

如果 pos 等于字符串长度,则该函数返回对字符串中最后一个字符后面的 null 字符的引用(不应修改(。

"Success!n"是长度为 9 的字符串。S位于索引 0,!位于索引 7,n位于索引 8。 因此,当您引用 s[9] 时,它会返回 nullchar。

而不是cout << s[i]使用cout << s.at(i),你会得到你想要的结果。