字符串超出范围c ++

时间:2014-09-05 14:12:15

标签: c++

当我尝试检查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

2 个答案:

答案 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
     
      
  1. 需要: const_reference operator[](size_type pos) const; reference operator[](size_type pos);

  2.   
  3. 如果pos <= size(),则返回: *(begin() + pos)。否则,返回对值为pos < size()的{​​{1}}类型的对象的引用,其中修改对象会导致未定义的行为。

  4.   
  5. 投掷: 没什么。

  6.   

也就是说,只要满足charT条件,该方法就不会抛出,否则行为是 Undefined ,抛出异常是其中一个例子。

答案 1 :(得分:1)

数组条目通常是0基于计数,因此在0和string :: length之间定义搜索范围至关重要.1。在C ++中,当访问string [n](n&gt; = len)时,它有时会返回垃圾,根据我的悲惨经历,写信通常会导致段错误。