2012-02-23 8 views
0

私は間違ったことをしているとは言えません。しかし、私はこのコードをもう少し先に進めてきました。C++の文字の比較が機能しない

私は再帰関数を持っています。それのほとんどはうまく機能しているので、私だけで動作していない部分を配置します:

//In main 
string C[] = {"S=>bS", 
        "S=>aaT", 
        "T=>aT", 
        "T=>bU", 
        "U=>Ua", 
        "U=>aa"}; 
CFG CFG1(C); 

... 

string *code; 
char startNT; 
//The CFG constructor 
CFG::CFG(string C[]) 
{ 
    code = C; 
    startNT = code[0][0]; 
} 

... 

//Inside of processData recursive function 
for(unsigned int i = 0; i < code->size(); i++) 
{ 
    if(code[i][0] == startNT) 
    { 
     string newStr = code[i].substr(code[i].find(">")+1); 
     string old = wkString; 
     //This is the recursive call 
     if(processData(inString, wkString.replace(wkString.find_first_of(startNT), wkString.find_first_of(startNT)+1, newStr))) 
     { 
      return true; 
     } 
     cout << wkString << endl; 
     wkString = old; 

    } 
} 

動作していない比較[i]が[0] == startNTコードです。まあ...私は言わなければならない、時間の100%働いていない。コード[i] [0]は 'S'になり、startNTは 'T'になります(呼び出し中に 'S'と 'T'を適切に比較できることを既に証明した後)。それはまだ 'true'と評価され、wkString.replace()は 'T'を見つけることができないので中断します。

私はC++を使用して以来、しばらくしているので、おそらく愚かな間違いをしています。助けてくれてありがとう。

答えて

3

codeは、文字列の配列の最初の文字列へのポインタです。だから、code->size()と言うと、これは最初の文字列のサイズ(文字数)です(与えた例では5)。私はあなたが最初の文字列の文字ではなく、文字列配列を反復しようとしていると確信しています。それは間違っている。

残念ながら、クラスにポインタを格納し、配列ではないため、配列のサイズはクラスでは分かりません。だから、それを正しく反復することはできません。何らかの形でコードを再構成する必要があります。より完全に見ることができなければ、具体的な提案はできません。

おそらくあなたがしたいことは、実際のクラスに文字列のコレクションを格納することです。デフォルトでは、私はベクトルを推奨します。あなたのコードは、この後、次のようになります。あなたが使用している

// in class CFG 
std::vector<std::string> code; 
char startNT; 

CFG(const string * C, int N) 
    :code(C, C+N), 
    startNT(code[0][0]) // strong assumption made here 
{} 
... 
// processData 
for(unsigned int i = 0; i < code.size(); i++) // note, dot instead of arrow 
{ 
... 
// in main 
std::string C[] = { 
    "S=>bS", 
    "S=>aaT", 
    "T=>aT", 
    "T=>bU", 
    "U=>Ua", 
    "U=>aa" 
}; 

CFG CFG1(C, sizeof(C)/sizeof(*C)); 
+0

ほとんどの場合、配列の代わりに 'std :: vector'を使うのは良い考えです。 – bitmask

+0

私はこれを行うためにベクトルを使用します。助けてくれてありがとう。しかし、将来の参照のために、渡された配列からサイズをコピーする未知のサイズの配列をクラスに含める方法はありませんか? – Taylor

+0

あなたがそのようなサイズを知っていないような配列を渡すと、そうでないので、あなたは何のためにもそのサイズを使うことができません。これは、C++で生の配列を使用しない理由の1つです。代わりにvectorまたはstd :: arrayを使用してください。 Std :: arrayは、よりうまく設計されていれば、生の配列のやり方を振る舞います。 – bames53

1

を、」私<コード - >サイズ(); i ++ 'はループを制御しますが、コードは文字列へのポインタなので、コード文字列の数ではなく、コードの最初の要素のサイズを伝えていると思います。