C++ libc++;abi.dylib:终止时出现类型为std::out\u of\u range的未捕获异常:基本\u字符串错误

C++ libc++;abi.dylib:终止时出现类型为std::out\u of\u range的未捕获异常:基本\u字符串错误,c++,macos,C++,Macos,当我第一次运行代码时,没有错误。 在我键入测试字符串之后,然后iaa它会给我: libc++abi.dylib:以std::out_of_range:basic_string类型的未捕获异常终止 我不知道是关于字符串函数还是我的输入 p、 该程序用于删除、插入和替换字符串中的字母 我的代码在下面 using namespace std; string str; bool flag = true; void del(char p) { int pos = str.find(p);

当我第一次运行代码时,没有错误。 在我键入
测试字符串
之后,然后
iaa
它会给我:

libc++abi.dylib:以std::out_of_range:basic_string类型的未捕获异常终止

我不知道是关于字符串函数还是我的输入

p、 该程序用于删除、插入和替换字符串中的字母

我的代码在下面

using namespace std;

string str;
bool flag = true;

void del(char p)
{
    int pos = str.find(p);
    if (pos != string::npos)
    {
        str.erase(pos,1);
        return ;
    }
    else
    {
        cout << "N" << endl;
        flag = false;
    }
}

void ins(string p1, string p2)
{
    int pos = str.find(p1[0]);
    if (pos == string::npos)
    {
        cout << "N" << endl;
        flag = false;
        return ;
    }
    int newpos = pos;
    while (pos != string::npos)
    {
        pos = str.find(p1,newpos);
        newpos = pos + 1;
    }
    str.insert(pos,p2);
    return ;
}

void repl(string p1, string p2)
{
    int pos = 0;
    int find = 0;
    find = str.find(p1[0],pos);
    if (find == string::npos)
    {
        cout << "N" << endl;
        flag = false;
        return ;
    }
    while (true)
    {
        find = str.find(p1[0],pos);
        if (find != string::npos)
        {
            str[find] = p2[0];
            pos = find + 1;
        }
        else
        {
            break;
        }
    }
    return ;
}

int main()
{
    getline(cin,str);
    char a;
    cin >> a;
    //cout << a << endl;
    if (a == 'D')
    {
        char p1;
        cin >> p1;
        del(p1);
    }
    else if (a == 'I')
    {
        string p1,p2;
        cin >> p1 >> p2;
        ins(p1,p2);
    }
    else if (a == 'R')
    {
        string p1,p2;
        cin >> p1 >> p2;
        repl(p1,p2);
    }
    if (flag)
    {
        cout << str << endl;
    }
    return 0;
}
使用名称空间std;
字符串str;
布尔标志=真;
void del(char p)
{
int pos=str.find(p);
if(pos!=字符串::npos)
{
str.erase(位置1);
返回;
}
其他的
{
cout-p2;
ins(p1,p2);
}
如果(a='R')
{
字符串p1、p2;
cin>>p1>>p2;
repl(p1,p2);
}
国际单项体育联合会(旗)
{

没有时间学习如何使用调试器。在抛出异常时使用它捕获异常,并找出它在代码中发生的位置。然后检查所有涉及的变量,查看它们的值并确保它们都有效。我敢打赌
newpos
将超出范围(在仍然不等于的情况下可能超出范围).Hi,这段代码的目的是什么?家庭作业?因为您正在重新实现现有的STL库函数。请将代码简化为问题的一部分。您当前的代码包含许多与问题无关的内容-最小的示例通常看起来类似于良好的单元测试:仅执行一个任务,并指定输入值为了再现性。是时候学习如何使用调试器了。使用它来捕获抛出的异常,并找出它在代码中发生的位置。然后检查所有涉及的变量以查看它们的值并确保它们都有效。我打赌
newpos
将超出范围(在仍然不等于的情况下可能是).Hi,这段代码的目的是什么?家庭作业?因为您正在重新实现现有的STL库函数。请将代码简化为问题的一部分。您当前的代码包含许多与问题无关的内容-最小的示例通常看起来类似于良好的单元测试:仅执行一个任务,并指定输入值为了再现性。