0

私はCプログラムに取り組んでおり、プログラムステートメントは次のとおりです。

文字列Sと、正の長さの文字列のリストF1、R1、F2、R2、...、FN、RNが与えられた場合、SでのFiの出現(左から右)を順番に検索し、置き換えます。それらをRiと一緒に。すべての文字列はアルファベット{0、1}の上にあります。検索では、以前の反復で置換の対象になっていないSの連続部分のみを考慮する必要があります。アルゴリズムの反復は、アルゴリズムによる以前の置換を上書きしてはなりません。

入力サンプル:

プログラムは、最初の引数としてファイル名へのパスを受け入れる必要があります。このファイルの各行は1つのテストケースです。各テストケースには、文字列、セミコロン、コンマ区切りの文字列のリストが含まれます。

10011011001; 0110,1001,1001,0,10,11

出力サンプル:

入力の各行について、置換が行われた後に文字列を出力します。

11100110

例:10011011001 =>10100111001[0110を1001に置き換える]=>10100110[1001を0に置き換える]=>11100110[10を11に置き換える]=>11100110

私のコードは、対応するすべてのFnをRnに置き換えることができますが、以前に行われた置き換えを上書きしています。交換されていないSの連続部分のみを検索する方法。私は次のように検索と置換を行っています:

  void string_sub(char s1[],char s2[],char s3[])
    {
            char r[200];
            printf("\n%s %s %s\n",s1,s2,s3);
            int i,j,k,x,y;
            char res[100];
            int len1=strlen(s1);
            int len2=strlen(s2);
            int len3=strlen(s3);
            j=0;
            i=0;
            while(i<len1)//searching for string 2 in string 1
            {
                    if(s2[j]==s1[i])
                    {
                            j++;
                            i++;
                            if(j==len2)
                            {
                              y=i;
                              x=i-len2;
                              break;        
                            }
                    }
                    else
                    {
                            if(s2[0]!=s1[i])
                            i++;
                            j=0;
                    }
            }
            k=0;
            for(i=0;i<x;i++)
            {
                    r[k]=s1[i];
                    k++;
            }
            for(i=0;i<len3;i++)
            {
                r[k]=s3[i];
                    k++;
            }
            i=y;
            while(i<len1)
            {
                    r[k]=s1[i];
                    k++;
                    i++;
            }
            r[k]='\0';//resultant string into r
            k=0;
           for(i=0;i<strlen(r);i++)//copying resultant string to s1
           {
            s1[k]=r[i];
            k++;
           }
           s1[k]='\0';
    }

私のCコード全体はここにあります

4

1 に答える 1

2

私があなたのコードを正しく理解していれば、あなたはあなたが得る各ペアの置換コードを呼び出し、変換された文字列を毎回渡すように思えます。私がすることは、その関数にも開始オフセットを渡し、その関数に、最後の置換で中断した、新しく置換された文字列内の場所を返すようにすることです。この関数は、毎回0ではなく、オフセットでs1の検索を開始します。(置換を実行しない場合は、オフセットを変更しないことを忘れないでください。)したがって、メイン関数で、0から始まるオフセット変数を作成し、それを関数に渡します。また、関数の結果をその変数に割り当てます。次にそれを呼び出すときは、最初ではなく最後のオフセットから開始します。これは意味がありますか?そうでなければ、私は自分の答えをもう少しうまく分解することを試みることができます。

主な機能では、次のようになります。

int offset = 0;

その後

offset = string_sub( offset, s1, s2, s3 );

関数は次のようになります。

int string_sub( int offset, char* s1, char* s2, char* s3 )
{
...

文字列の置き換えが完了した時点で、次のようになります。

offset = y;

そして最後にあなたはこれをするでしょう

return( offset );
}

それは役に立ちますか?

@Mikeが気づいたように、私の答えは完全には正しくありません。要件を十分に読んでいないため、最後に確認したポイントより前のすべてを無視すると誤って想定していました。オフセットを渡してから新しいオフセットを返す代わりに、範囲の配列を含む構造体を渡す必要があります。各範囲は、置換された文字の範囲であり、そのため、タッチできず、方法の数です。その配列には多くの範囲があります。これはCであるため、簡単なアレイ管理の贅沢はありません。そのため、これを難しい方法で行う必要があります。構造を次のように見せます。

#define MAX_RANGES (10)

struct RangeEntry
{
    int first;
    int last;
};

struct RangeData
{
    int numRanges;
    struct RangeEntry ranges[MAX_RANGES];
};

次に、代替関数のプロトタイプを次のようにします。

int string_sub( char* s1, char* s2, char* s3, struct RangeData* rangeData )

メイン関数では、この構造をインスタンス化し、numRangesを0に初期化してから、このインスタンスへのポインターを関数に渡します。関数では、s1を少し異なって見る必要があります。文字列の終わりを超えたかどうかを確認するだけでなく、これらの範囲のいずれかに遭遇したかどうかを確認する必要があります。一致している場合、一致は次の範囲の開始時に終了する必要があります。そうでない場合は、次の範囲の終わりの世話を続ける必要があります。

これがお役に立てば幸いです。先ほどの間違った答えをお詫び申し上げます。

于 2013-03-16T13:23:38.500 に答える