当我尝试检查str[index]
是否等于我有异常 字符串超出范围
std::string Test::getTheText(std::string str) {
int index = 7;
string text;
cout << str[index] << endl; // Work!!
while (str[index] != '\"') // Exception,why?? also try while(str[index]!=34)
text += str[index++];
return text;
}
我的字符串是:文字 - bla bla
答案 0 :(得分:5)
为什么以下代码有效?
std::string str = "bla bla"; int index = 7; cout << str[index] << endl; // Work!!
如果index
等于字符串的长度(在您的情况下 ,7 == strlen("bla bla")
),则访问运算符返回对默认值{{的引用1 {}在charT
实例化中,对于std::basic_string<charT>
,它是char
)。
C++ string::operator[] reference
如果pos 不大于字符串长度,则函数永远不会抛出异常(无抛出保证)。
但是,稍后您尝试访问另一个元素:
\0
而只有才属于:
[...],它会导致未定义的行为。
C ++标准参考:
§21.4.5basic_string元素访问[string.access]
str[index++] // in second iteration, the first is ok though
需要:
const_reference operator[](size_type pos) const; reference operator[](size_type pos);
如果
pos <= size()
,则返回:*(begin() + pos)
。否则,返回对值为pos < size()
的{{1}}类型的对象的引用,其中修改对象会导致未定义的行为。- 醇>
投掷: 没什么。
也就是说,只要满足charT
条件,该方法就不会抛出,否则行为是 Undefined ,抛出异常是其中一个例子。
答案 1 :(得分:1)
数组条目通常是0基于计数,因此在0和string :: length之间定义搜索范围至关重要.1。在C ++中,当访问string [n](n&gt; = len)时,它有时会返回垃圾,根据我的悲惨经历,写信通常会导致段错误。