2015-07-10 113 views
-4
#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); 
    } 
} 

上述代码基本上用于打印两个字符串s1s2的所有交错。现在,我最初输入s1s2,并将它传递给函数printinter,它通过递归打印交织。基本上,它修复第一个字符,然后递归剩余的字符,然后修复其他字符串的第一个字符并递归剩余的字符,每次递减1个单位。最后,它打印输出。为什么发生这个错误?

当我尝试运行它,它给出了错误,libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: basic_string Abort trap: 6

现在,我通过放置在不同的地方cout语句来找出错误,因为在过去两年的时间想。但似乎没有任何工作。在运行调试器时,它不会在第一次迭代本身中打印output。我不知道为什么。我不会在这里问它,但是,我不知道错误是什么。我通常自己调试代码,但是帮助我完成这个。谢谢!

+0

它有太多的错误,为一个简单的答案。最严重的是,你不会在递归调用中交换字符串,所以它不会按照你想要的方式交替。但是因为它没有交替,所以当我通过在第一个字符串中的使用增加i时,将i用作第二个字符串的索引变得错误。 – JSF

+0

我建议你简化并且只传递没有索引的子串或传递未修改的原始字符串以及索引。通过嵌套到递归调用中修改字符串和索引,您所做的事似乎是两次完成相同的工作,而您似乎混淆了您的意图。 – JSF

回答

1

令人惊讶的是,人们对此投入不足以解释原因。如果我不得不猜测,人们会因为代码做一些奇怪/不安全的事情而投票不起作用,尽管现在我正在把言词放在嘴边。

std::string::substr()文档说这个:

如果pos超过字符串长度,一个out_of_range异常被抛出。

每次递归调用缩小沿因为substr()分配一个新的字符串对象传递的字符串的大小:

返回其值新建字符串对象初始化为这个子串的副本目的。

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

+0

解决。我使用指向char数组的指针而不是字符串。在这种情况下,字符串似乎很难处理。但是,你能告诉我为了使它能够与字符串一起工作,我应该怎么做? –

+0

无论您使用指向char数组的指针,都应该将其转换为字符串。 – JSF

0

我认为你试图这样的事情,但只是使事情复杂得多,他们需要是。如果这不是你的意思,那么你可以澄清。任何额外的复杂性(例如输出字符串),您可能真的有一个原因,可以很容易地添加到这个简化的版本,而不会打破它。

#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; 
    } 
} 
+0

不,不,事情是,你的代码只打印其中一个输出。我必须打印所有的交错,其中两个字符串的交错是一个字符串,它包含两个字符串的所有字符,并且新字符串中字符的相对顺序与原始字符串相同。 –

+0

此外,我做了与char数组指针完全相同的事情,它的工作原理,但不是上面的子字符串。我想,找到一个子字符串肯定有一些错误。 –

1

我没有看到你的原始代码甚至试图做如下的事情。但是你对你想要做的描述似乎是以下内容。这是你的意思吗?

#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'; 
    } 
} 
+0

对,这工作。谢谢! :) –

相关问题