索引字符串时,s[i]起作用,而s.at(i)抛出。为什么?

遇到这种奇怪的情况,用at()替换[]失败。
我们有一个字符串向量,其中一些字符串嵌入了分隔后续使用标记的NUL。
该代码提取初始字符串,直到每个向量中的第一个nul。
at()正在捕获[]未定义行为的使用吗

#包括<iostream>
#包括<字符串>
#包括<向量>
使用名称空间std::literals;
使用std::string、std::vector、std::cout;
int main()
{
//给定一个包含嵌入nul的字符串向量,提取字符直到第一个nul
向量<字符串>vs{item1\0A"s,"item2"s};
//这个很好用。
用于(常量字符串和s:vs)
{
for(int i=0;s[i];i++)
cout<<s[i];
不能;;
}
//s.at(i)是s[i]的边界检查版本
//但失败了
用于(常量字符串和s:vs)
{
for(int i=0;s.at(i);i++)//此处引发超出范围的异常
第(i)款;
不能;;
}
}

不,没有未定义的行为
https://en.cppreference.com/w/cpp/string/basic_string/operator_at
对于运算符[],如果pos==size(),则返回对具有值CharT()的字符(空字符)的引用。
但是,在(size())处,将抛出。要记住的东西

//这很有效。
用于(常量字符串和s:vs)
{
对于(int i=0;i<s.length()&s.at(i);i++)
第(i)款;
不能;;
}

发表评论