【问题标题】:c++ does not throw error if accessing wrong index of string [duplicate]如果访问错误的字符串索引,c ++不会抛出错误[重复]
【发布时间】:2015-11-02 07:02:54
【问题描述】:

我有以下代码:

string s = "haha";
cout << s << endl; //haha
cout << s.length() << endl; //4
cout << (s[25] == 'h' ? "is h" : "is not h") << endl; //is not h
cout << s[0] << endl; // h
cout << s[25] << endl; // nothing...blank

似乎指向任何索引,即使它超出范围也不会引发任何错误......这是什么原因?

【问题讨论】:

  • C++ 不对自身进行任何边界检查。您需要知道自己在做什么。
  • @PMF:确实如此,但前提是您告诉它这样做。通过[] 访问无效索引是未定义的行为。这意味着该行为未定义为提供错误消息、引发异常或使程序崩溃。它可以,但不是必须的,因此实现不必进行额外的边界检查——加快速度。通过at()访问被定义为如果索引无效则抛出异常。
  • 回答你的“原因是什么”stackoverflow.com/questions/1239938/…

标签: c++ arrays string


【解决方案1】:

效率。您可以使用at 函数进行边界检查。

【讨论】:

    【解决方案2】:

    string 类在at 函数中提供绑定检查,如果下标无效则抛出异常。

    【讨论】:

      【解决方案3】:

      std::string::operator[]documentation 说:

      char& operator[] (size_t pos);
      

      异常安全

      如果 pos 不大于字符串长度,则函数从不抛出异常(no-throw 保证)。 否则,会导致未定义的行为。

      【讨论】:

        【解决方案4】:

        在stl字符串的文档中,here中关于operator[]的部分提到了 (对于字符串s,位置pos,s[pos])

        异常安全 如果 pos 不大于字符串长度,则该函数永远不会抛出 >exceptions(无抛出保证)。 否则,它会导致未定义的行为。

        一个有趣的点是:

        如果 pos 等于字符串长度,则函数返回对 >null 字符 ('\0') 的引用。(C++98)

        如果 pos 等于字符串长度,则该函数返回对>字符串中最后一个字符之后的空字符的引用,>不应修改。(C++11)

        但是成员函数“.at”正如它在文档中所说的那样:

        强保证:如果抛出异常,则>字符串没有变化。

        如果 pos 不小于字符串长度,则 >throw out_of_range 异常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 1970-01-01
          • 2018-04-15
          • 2020-02-22
          • 1970-01-01
          • 2021-07-10
          • 2014-06-29
          相关资源
          最近更新 更多