2017-02-24 32 views
-2

从使用C++的函数将修改的字符串返回到main()时出现段错误。我不知道代码中出了什么问题。目标是递归地从字符串's1'中删除字符串'rem1'。为了参考,我在帖子中加入了我的代码。为什么我在从递归函数返回字符串到C++中的main时出现段错误

#include <iostream> 
#include <string> 
using namespace std; 
string recursiveRemove(string s, string rem); 
int main() 
{ 
    string s1 = "eat tdydyfygyhdy"; 
    string rem1 = "dy"; 
    //recursively remove the rem string from s 
    s1 = recursiveRemove(s1, rem1); 
    cout<<s1<<endl; 
    return 0; 
} 

string recursiveRemove(string s, string rem){ 
    cout<<"In recursive function s is now = "<<s<<endl; 
    cout<<"rem = "<<rem<<endl; 
    if(s.length() == 0){ 
     //cout<<s<<endl; 
     //return; 
     return s; 
    } 
    if(s == rem){ 
     //cout<<""<<endl; 
     //return; 
     return ""; 
    } 
    if(s.length() < rem.length()){ 
     //cout<<s<<endl; 
     //return; 
     return s; 
    } 

    else{ 
     cout<<"Entered into Else section"<<endl; 
     int i = 0, j = 0; 
     int startInd; 
     while(i<s.length() && s[i] != rem[j]) { 
      i++; 
     } 
     cout<<"i = "<<i<<endl; 
     if(i == s.length()){//reached the end of the string 
      cout<<"i = "<<i<<" s.length() = "<<s.length()<<", s="<<s<<endl; 
      //cout<<s<<endl; 
      //return; 
      return s;//temp; 
     } 
     else{//match found for first character 
      startInd = i; 
      while(i<s.length() && j<rem.length()){ 
       cout<<"Inside while, s[i] = "<<s[i]<<", rem[j] = "<<rem[j]<<endl; 
       if(s[i] != rem[j]){ 
        //cout<<"inside if s[i]="<<s[i]<<", rem[j]=" 
        //cout<<s<<endl; 
        //return; 
        return s; 
       } 
       i++; 
       j++; 
       cout<<"after increase i= "<<i<<" j="<<j<<endl; 
      } 
      int noOfCharsMatched = i - startInd; 
      s.erase(startInd, noOfCharsMatched); 
      s = recursiveRemove(s, rem); 
     } 
    } 
} 
+1

精液变得多深?溢出堆栈(又名StackOverflow)? –

+0

为了测试我已经使用了3次递归。但即使是第一次递归也会导致分段错误。 – Ishrat

回答

1

错误似乎是在这一行:s = recursiveRemove(s, rem);

首先,除非使用&符号(&),否则按C++值传递参数。这意味着每个s是一个副本,将其改为而不是会影响提供给函数调用的原始参数。

其次,你的函数有一个不返回的执行路径,它最终被采用。这是未定义的行为。

你可能要做的是返回递归函数调用的结果。尝试将其更改为return recursiveRemove(s, rem);

+0

非常感谢Francois!它像魔术一样工作。我甚至没有意识到那里的黑洞! – Ishrat

相关问题