プロが教えるわが家の防犯対策術!

2つの文字列を入力後、それらを比較して、前者の文字列の中から後者の文字列に該当する箇所を削除するコードはどうなるのでしょうか?

たとえば、前者の文字列が"abacbat"で、後者の文字列が"bac"だった場合、前者の"bac"の部分が削除されて、"abat"と出力されるようにしたいのです。

A 回答 (3件)

前の文字列を先頭から一つづつポインタを移動させて


後の文字列とmemcmpで一致しているか判定して
一致するポインタを記録していって
いくつかある候補でどれを削除するかを決めて削除
    • good
    • 0

自分で「手」でやるときはどういう風にやるか考えましょう。



手元に「a」「b」「a」「c」「b」「a」「t」と「b」「a」「c」と書いた紙切れを用意して、手で実際にやってみます。

そのときの動きをそのままコーディングすると、出来上がるはずです。
但し、
・該当文字列が無かった場合
・該当文字列が2回以上現れる場合
については何も書かれていないので、フラグを使うとか工夫が必要ですけど。

たとえでやると、

abatbacbat-bac

・出力用のエリアを準備します。
・最初の文字を対象文字列(1)と比べます。
・違うのでそのカードを出力エリアに並べます。
・次の文字を対象文字列(1)と比べます。
 ・同じなのでその次の文字と対象文字列(2)を比べます。
  ・またおなじなのでその次の文字と対象文字列(3)と比べます。
・違ったので、出力エリアに3文字分並べます。
・次の文字を対象文字列(1)と比べます。
 ・同じなのでその次の文字と対象文字列(2)を比べます。
  ・またおなじなのでその次の文字と対象文字列(3)と比べます。
  ・3文字ともおなじなので、出力エリアには文字を出さず次へ行きます。
・次の文字を対象文字列(1)と比べます。
 ・同じなのでその次の文字と対象文字列(2)を比べます。
  ・またおなじなのでその次の文字と対象文字列(3)と比べます。
・違ったので、出力エリアに3文字分並べます。
・次の文字は終了文字なので終了。

の様に手でやると思いますが、コーディングするときどこをループにするか等考えましょう。



※ 実際は、関数を使って一気に処理しますけどね…。
※ アルゴリズムの問題だと思ったので、こういう回答にしました。
    • good
    • 0
この回答へのお礼

1つずつ文字を入力していき、実際にやってみました。

なんとなくですが、構造をつかめてきました。
もう少しやってみることにします。

お礼日時:2011/06/14 15:41

strstr という関数を使えば、多少楽かも。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!