【发布时间】:2015-09-29 11:46:42
【问题描述】:
#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);
}
}
打印两个字符串s1和s2的所有交错基本上都需要上面的代码。现在,我最初输入s1 和s2,并将其传递给函数printinter,该函数通过递归打印交错。基本上,它固定第一个字符,然后递归剩余字符,然后固定另一个字符串的第一个字符并递归剩余字符,并且每次将长度递减 1 个单位。最后,它打印输出。
当我尝试运行它时,它给出了错误,libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: basic_string
Abort trap: 6
现在,自过去两个小时以来,我一直在尝试通过在各个地方放置 cout 语句来找出错误。但似乎没有任何效果。在使用调试器运行时,不知何故,它不会在第一次迭代本身中打印output。我不知道为什么。我不会在这里问它,但是,我不知道错误是什么。我通常自己调试代码,但请帮我解决这个问题。谢谢!
【问题讨论】:
-
一个简单的答案有太多错误。最严重的是你没有在递归调用中交换字符串,所以它不会按照你想要的方式交替。但是因为它不交替使用,所以当 i 因在第一个字符串中的使用而增加时,使用 i 作为第二个字符串的索引就会出错。
-
我建议您简化并仅传递不带索引的子字符串或传递未修改的原始字符串以及索引。通过在嵌套到递归调用中同时修改字符串和索引,您确实需要两次似乎是相同的工作,并且您似乎混淆了您的意图。