遇到这种奇怪的情况,用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)款;
不能;;
}