0

これを効果的に行う方法がわからないことに本当に驚いています。sscanfと組み合わせたstrstrを試しましたが、他の言語での経験に基づいて期待したとおりに機能するものはないようです。

「 ABCDEFGHIJKBEGINTheMiddleENDLMNOPQRS」の文字があります。「 BEGINTheMiddleEND 」が文字列のどこにあるかわかりません。 「 BEGIN」と「END 」の出現箇所を見つけてその間にあるものを取得することにより、 「 TheMiddle 」に等しい文字で終了したいと思います。

これを達成するための最も効率的な方法は何ですか(検索とサブストリング)?

ありがとう!

-回答に基づいて編集-

私はこれを試しました:

char *searchString = "ABCDEFG HIJ K BEGINTheMiddleEND LMNO PQRS"
char *t1, *t2;
t1 = strstr(searchString, "BEGIN");
t2 = strstr(t1, "END");

しかし、それは私にはうまくいかないので、ポインタの観点からは何かが間違っているに違いありません。Strstrは2つの引数しか受け取らないので、前のポインターから始めて何を意味するのかわかりません。また、これらのポインタはstrposが返すような整数値ではなく、文字ポインタであるため、これらのポインタを使用して部分文字列を作成する方法もわかりません。

再度、感謝します。

-最終コードで編集-

これに当たる他の人のために、最終的な、機能するコード:

char *searchString = "ABCDEFG HIJ K BEGINTheMiddleEND LMNO PQRS"
char *b = strstr(searchString , "BEGIN");
char *e = strstr(b, "END");
int offset = e - b;
b[offset] = 0;

ここで、「b」は「BEGINTheMiddle」と等しくなります。(これは、この場合に必要なものです)。

みなさん、ありがとうございました。

4

3 に答える 3

4

文字列が何であるかを理解する必要があります。0で区切られた文字のシーケンス。

strstrはそれが言うことをします:それは与えられた部分文字列の始まりを見つけます。

したがって、針「BEGIN」を使用してstrstrを呼び出すと、このサブストリングの位置に移動します。5文字進んだ「BEGIN」を指すポインタは、次の0文字までの「TheMiddle」を指しています。「END」を検索すると、終了ポインタが見つかります。次に、サブ文字列を新しい文字列配列にコピーする(または、「E」を0に置き換えることで切り取る)か、そうでない独自の文字列関数を実装する必要があります。 0で終了する文字列を使用するため、任意にオーバーラップできます)。

それはおそらくあなたがまだ欠けているステップです:実際に文字列をコピーします。例:

 t3 = strndup(t1, t2 - t1);

文字列ABCDEF0を取ります。ここで、0は実際の0文字です。先頭へのポインタは完全な文字列を指し、Eを指すポインタは「EF」のみを指します。文字列「AB」を取得する場合は、それを「AB0」にコピーするか、Cを0に置き換える必要があります。

strstrはコピーを行いません。位置を見つけるだけです。インデックスがint offset = newPosition - oldPosition;必要な場合は実行できますが、検索を続行する必要がある場合は、newPositionポインタを操作する方が簡単です。

これはすべて、Javaでの文字列操作などよりも直感的ではありません。文字列を切り捨てることを除いて、私が知る限り、実際にはより効率的であり、0で終了するメモリレイアウトを理解している場合、それは非常に理にかなっています。文字列を配列と考える場合にのみ、途中にポインタがあり、通常の配列のように使用し続けるのは奇妙に思えるかもしれません。これにより、「sub = string+offset」はCの「sub=string.substring(offset)」の記述方法になります。

于 2012-09-25T23:35:56.307 に答える
3

2回使用しますstrstr()が、sencond時間は、strstr()+ strlen(BEGIN)への最初の呼び出しによって返された位置から始まります。

から返される最初のポインタstrstr()がBEGINの先頭になるため、これは効率的です。したがって、文字列全体をもう一度調べることはありませんが、BEGIN-ingから開始し、そこからENDを探します。これは、せいぜい文字列全体を1回実行することを意味します。

于 2012-09-25T22:05:59.083 に答える