【问题标题】:c++ terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr:c++ 在抛出 'std::out_of_range' 实例后调用终止 what(): basic_string::substr:
【发布时间】:2018-03-20 02:05:01
【问题描述】:

运行时出现此错误:

在抛出 'std::out_of_range' 的实例后调用终止 what(): basic_string::substr:

我是全新的,任何其他提示也将不胜感激。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string name;
    int position = 1;
    string letter;

    cout << "Enter in your full name seperated by a space: ";
    getline (cin, name);

    cout << name.substr(0, 1);

    while (position <= name.length())
    {
        position++;
        letter = name.substr(position, 1);

        if (letter == " ")
        {
            cout << name.substr(position + 1, 1) << " ";
        }
    }

    cout << endl;

    return 0;
}

【问题讨论】:

  • 在一张纸上用一个小字符串遍历position 的值。
  • position + 1 在最后三个迭代中越界。你有很多东西要学,包括如何正确地迭代具有 0 索引的东西。此外,如果您只想要一封信,请使用name[position]。建议获取good book
  • 要遍历string 中的值,请使用基于范围的for 循环,例如for( char const ch: name )。请注意,这些值是编码值,对于通常的 UTF-8 编码,仅当这些字符在 ASCII 子集中时才对应于这些字符。不幸的是,C++ 库中没有直接支持迭代 characters 或推进一个字符,但是使用 UTF-8 这很容易实现,并且您使用字符串表示字符的方法是明智的,然后你会像你一样使用普通的for循环。

标签: c++


【解决方案1】:

您试图在最后一个索引之后到达一个索引,您需要将循环条件更改为: position &lt; name.length()

您可以使用更用于此类问题的 for 循环来解决此问题,您只需将 while 循环替换为:

for (int position = 0; position < (name.length()-1); position++) {
    if (name[position] == ' ') {
        cout << name[position+1];
    }
}

使用这个你不需要使用substr() 方法也不需要string letter

【讨论】:

    【解决方案2】:

    在您的循环中,position 将增加到等于用户输入的字符的数字(即“Abc Def”最后一次循环迭代:位置 = 8)。在这种情况下,name.substr(position, 1); 尝试提取字符串中最后一个字符之后的字符,因此出现std::out_of_range 异常。 您可能希望将循环条件更改为:while (position &lt;= name.length() - 1)while (position &lt; name.length())

    【讨论】:

    • 这仍然是超出范围的,因为他做了name.substr(position + 1, 1)
    • @FeiXiang 如果输入以空格结尾,则只会越界。
    • 不,@FeiXiang 是对的。 position++; 也发生在测试之后。
    • @user4581301 不,如果传递给substrposition 参数等于字符串长度,则函数返回一个空字符串。见here。不会有std::out_of_range 异常。
    • 我看到你了。坏主意,但不是致命的。 ++ 的定位仍然是个问题。
    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    相关资源
    最近更新 更多