1

私は私のプログラムのこの最後の部分で本当に助けが必要です。より大きな文字列内で文字列を見つける必要があり、見つかった場合はサブ文字列の開始位置を返します。指示から:

文字列の場所は0から始まり、長さ-1で終わることに注意してください。文字列が見つからない場合は、-1の値が返されます。

私が始めて、次のコードがコンパイルされました。これが実際に正しいかどうかを知りたいだけです。頭を抱えすぎたくないのですが、専門家からのフィードバックが必要です。私はこれを正しくやっていますか?または、少なくとも私は正しい方向に進んでいますか?

const int MyString::Find(const MyString& other)
{
    int start(0);
    int counter(0);
    int end = other.Size;
    int count(0);
    int end1 = Size;
    int nfound = -1;

    char* temp;
    temp = new char[other.Size];

    if(other.String[0] != '\0' && other.String[0] != ' ')
    {
             if(other.String[count] == String[counter])
                    {
                            start = counter;

                            for(int i = count; i < end-1;i++)
                            {
                                    for(int j = counter; j < end1 -1; j++)
                                    {


                                            temp[j] = String[j];
                                    }
                            }
                            if(other == temp)
                            {
                                    return start;
                            }
                            else
                                    return nfound;
                    }

            else{
            while(other.String[count] != String[counter])
            {
                    counter++;
                    if(other.String[count] == String[counter])
                    {
                            start = counter;
                            for(int i = count; i < end-1;i++)
                            {
                                    for(int j = counter; j < end1 -1; j++)
                                    {


                                            temp[j] = String[j];
                                    }
                            }
                            if(other == temp)
                            {                 
                                    return start;                               
                            }
                            else
                                    return nfound;
                    }







            }


            }

    }
    else
    {
            return nfound;
    }





  }
4

3 に答える 3

1

この行は大丈夫ですが、対応するdeleteステートメントが必要です。

temp = new char[data.Size];

しかし、私はこの行があなたが望むことをすることを疑っています:

temp = data.String;

Mystring::String(より慣習的に名前Mystring::stringが付けられていましたが、それを通過させます)がタイプを持っていると仮定するとchar *、後者の行はdata.String、のバッファに文字をコピーしませんtemp。代わりに、バッファを失い、その後tempは単なる同義語であり、と同じメモリを指しますdata.String

于 2012-06-11T02:36:57.613 に答える
1

コードを書くとき、最初に必要なのは、実装するアルゴリズム、それを記述するための自然言語の使用、アルゴリズムの進行状況を描くためのペンと紙、そしてペンと紙でそのアルゴリズムを再度検証することです。次に、解決策があると思ったら、それをコーディングしてテストします。しかし、実際にはプログラミング言語でコーディングすることは、最後に行うべきことです。

大きな文字列内の部分文字列を見つける簡単なアルゴリズムは、大きな文字列内の検索パターンの最初の文字を検索することから始まり、その位置を呼び出しますstart。見つかったら、そのアンカーから後続の各位置を比較します。一致しない場合は、から最初の位置にある要素の検索を開始しますstart+1。比較が成功した場合は、終了です。元の文字列の最後に到達した場合、検索は失敗します。

// pseudocode
start <- 0
while start <> str.size()
   start <- find( str+start, pattern[0] )
   if start == str.size()
      break
   if (compare_from( str+start, pattern ) == EQUAL)
      return success(start)
if start == str.size()
   return failure

これをC++に変換するだけで済みます。通常、複雑なサブ操作を関数として実装することをお勧めします。これにより、一度に飲み込むのではなく、少しずつ複雑に対処できるようになります。上記の各操作は、実装するのに十分単純である必要があります。そうすれば、アルゴリズム全体が適切に機能します。

于 2012-06-11T03:06:54.647 に答える
0

これは宿題だと思いますので、直接答えるつもりはありませんが、現在のアルゴリズムはまだ正解に近いものではありません。

別の文字列内のサブ文字列を見つけるには、文字列とサブ文字列の独立したカウンターが必要です。

于 2012-06-11T02:42:42.237 に答える