2017-02-24 6 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

どのように深呼吸は深くなりますか?スタックがオーバーフローしていますか(a.k.a. StackOverflow)? –

+0

テストのために私は3回の再帰まで使用しました。しかし、最初の再帰でさえ、私にセグメンテーション違反が与えられます。 – Ishrat

答えて

1

エラーはこの行にあるようです:s = recursiveRemove(s, rem);

最初に、アンパサンド(&)を使用しない限り、C++のパラメータは値によって渡されます。これは、それぞれsがコピーであることを意味し、ではなくは、関数呼び出しに与えられた元の引数に影響します。

第2に、関数には返されない実行パスがあり、最終的には実行されます。これは未定義の動作です。

可能性が高いのは、再帰関数呼び出しの結果を返すことでした。それをreturn recursiveRemove(s, rem);に変更してみてください。

+0

ありがとう、フランソワ!それは魔法のように働いた。私はそこにブラックホールを認識していない! – Ishrat

関連する問題