Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么会发生这种错误?_C++_String_Recursion - Fatal编程技术网

C++ 为什么会发生这种错误?

C++ 为什么会发生这种错误?,c++,string,recursion,C++,String,Recursion,上面的代码基本上用于打印两个字符串s1和s2的所有交错。现在,我首先在s1和s2中获取输入,并将其传递给函数printiner,该函数通过递归打印交错。基本上,它先修复第一个字符,然后对其余字符进行递归,然后修复另一个字符串的第一个字符,并对其余字符进行递归,每次将长度减少1个单位。最后,它打印输出 当我尝试运行它时,它给出了错误libc++abi.dylib:终止为std::out_of_range:basic_string类型的未捕获异常 中止陷阱:6 现在,在过去的两个小时里,我在不同的地

上面的代码基本上用于打印两个字符串s1和s2的所有交错。现在,我首先在s1和s2中获取输入,并将其传递给函数printiner,该函数通过递归打印交错。基本上,它先修复第一个字符,然后对其余字符进行递归,然后修复另一个字符串的第一个字符,并对其余字符进行递归,每次将长度减少1个单位。最后,它打印输出

当我尝试运行它时,它给出了错误libc++abi.dylib:终止为std::out_of_range:basic_string类型的未捕获异常 中止陷阱:6


现在,在过去的两个小时里,我在不同的地方放置cout语句来找出错误。但似乎什么都不管用。在使用调试器运行时,不知何故,它不会在第一次迭代中打印输出。我不知道为什么。我不会在这里问,但是,我不知道是什么错误。我通常自己调试代码,但请帮我调试一下。谢谢

我很惊讶人们在不费心解释原因的情况下投票反对这一点。如果非要我猜的话,人们之所以投票反对,是因为代码做了一些奇怪/不安全的事情,尽管现在我把这些话放进了他们的嘴里

其文档说明如下:

如果pos大于字符串长度,则引发超出范围异常

每个递归调用都会缩小传递的字符串的大小,因为substr分配了一个新的字符串对象:

返回新构造的字符串对象,其值初始化为该对象的子字符串的副本


。。。但我会继续增长,直到它超过传递的字符串的长度。

我想你是在尝试这样的东西,但只是让事情变得比需要的更复杂。如果这不是你的意思,那么你可以澄清一下。任何额外的复杂性,例如您可能有理由使用的输出字符串,都可以轻松地添加回这个简化版本,而不会破坏它

#include <iostream>
#include <string>
using namespace std;
void printinter(string p1, string p2, int m, int n, string output, int i);
int main (void)
{
    string s1,s2,output="";
    cin>>s1>>s2;
    int m = s1.length();
    int n = s2.length();
    int i = 0;
    printinter(s1,s2,m,n,output,1);
    return 0;
}

void printinter(string p1, string p2, int m, int n, string output, int i)
{
    if (m == 0 && n == 0)
    {
        cout<<output<<"\n";
        return;
    }
    else if ( m!= 0)
    {
        //string foo = p1.substr(0,1);
        //cout<<foo<<"\t"; // used for debugging
        output = output + p1.substr(0,1);
        cout<<output<<"\t"; // used for debugging
        printinter(p1.substr(i,m),p2,m-1,n,output,i+1);
    }
    else if (n != 0)
    {
        output = output + p2.substr(0,1);
        printinter(p1,p2.substr(i,n),m,n-1,output,i+1);
    }
}

我不明白您的原始代码是如何尝试执行以下操作的。但是你对你想做什么的描述似乎如下。这就是你的意思吗

#include <iostream>
#include <string>
using namespace std;
void printinter(string p1, string p2);
int main (void)
{
    string s1,s2,output="";
    cin>>s1>>s2;
    printinter(s1,s2);
    return 0;
}

void printinter(string p1, string p2)
{
    if (p1.length())
    {
        cout << p1[0];
        printinter(p2, p1.substr(1));
    }
    else
    {
        cout << p2;
    }
}

对于一个简单的答案来说,它有太多的错误。最严重的是,您没有在递归调用中交换字符串,因此它不会按照您想要的方式进行替换。但是,由于它不是交替的,当i在第一个字符串中的使用量增加时,将i用作第二个字符串的索引将是错误的。我建议您简化并只传递不带索引的子字符串,或者传递未修改的原始字符串以及索引。通过在嵌套到递归调用中时修改字符串和索引,您正在做两次“希望”似乎是同一项工作,并且您似乎混淆了您的意图。已解决。我使用指向字符数组的指针而不是字符串。在这种情况下,字符串似乎太难使用。但是,你能告诉我,为了使它能够处理字符串,我应该做什么更正吗?无论你对指向字符数组的指针做了什么,都应该可以轻松地转换为字符串。不,不,问题是,你的代码只打印一个输出。我必须打印所有的交错,其中两个字符串的交错是一个字符串,它包含两个字符串的所有字符,并且新字符串中字符的相对顺序与原始字符串相同。此外,我使用指针指向字符数组方法做了完全相同的事情,它可以工作,但不适用于上面的子字符串。我想,查找子字符串时一定有错误。
#include <iostream>
#include <string>
using namespace std;
void printinter(string p1, string p2,string output);
int main (void)
{
    string s1,s2,output="";
    cin>>s1>>s2;
    printinter(s1,s2,output);
    return 0;
}

void printinter(string p1, string p2, string output)
{
    if (p1.length())
    {
        if (p2.length())
        {
            printinter(p1.substr(1),p2,output+p1[0]);
            printinter(p1,p2.substr(1),output+p2[0]);
        }
        else
        {
            cout << output+p1 << '\n';
        }
    }
    else
    {
        cout << output+p2 << '\n';
    }
}