• ベストアンサー

C言語の文字列について教えてください。

2つの文字列を入力後、それらを比較して、前者の文字列の中から後者の文字列に該当する箇所を削除するコードはどうなるのでしょうか? たとえば、前者の文字列が"abacbat"で、後者の文字列が"bac"だった場合、前者の"bac"の部分が削除されて、"abat"と出力されるようにしたいのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.2

自分で「手」でやるときはどういう風にやるか考えましょう。 手元に「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文字分並べます。 ・次の文字は終了文字なので終了。 の様に手でやると思いますが、コーディングするときどこをループにするか等考えましょう。 ※ 実際は、関数を使って一気に処理しますけどね…。 ※ アルゴリズムの問題だと思ったので、こういう回答にしました。

ytytowngogo
質問者

お礼

1つずつ文字を入力していき、実際にやってみました。 なんとなくですが、構造をつかめてきました。 もう少しやってみることにします。

その他の回答 (2)

回答No.3

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

  • hrsmmhr
  • ベストアンサー率36% (173/477)
回答No.1

前の文字列を先頭から一つづつポインタを移動させて 後の文字列とmemcmpで一致しているか判定して 一致するポインタを記録していって いくつかある候補でどれを削除するかを決めて削除

関連するQ&A

  • C言語で16進数の文字コードを文字列に変換

    16進の文字コードを入力してそれに対応する文字列を出力したいのですが 文字列から16進コードに変換出来ても16進コードから文字列に変換することが出来ません。 参考になるコードかサイト、または何かヒントがございましたらよろしくお願い致します。

  • C言語の文字列に関する質問です。(初心者です)

    文字列の文字を削除するにはどのようなアルゴリズムで考えればいいのでしょうか。 例えば文字列を入力した後、文字を入力し、その文字を文字列から削除するプログラムを作る場合、どのような処理でこれを実現できますか?

  • c言語の文字列出力

    プログラミング超初心者です サイトで文字列の出力について調べていたところ c言語は変数に文字列を代入することができないのでstrcpy関数を使い以下のようにするとあります char s[5]; strcpy(s, "ABCDE"); printf("%s\n", s); ところが他のサイトでは以下のように説明しています char s[5] = "ABCDE"; printf("%s\n", s); 明らかに後者の方が簡単で良いように見えるのですが違いはなんですか? あと、文字列の配列の指定?の[5]の部分なのですが 数字を記載しているところがほとんどですが省略しているところも有ります どんな文字列が入るかわからない場合もありますがここは省略しない方が良いのですか? よろしくお願いします

  • 【C言語】文字列による処理の分岐について

    いつも丁寧な解説拝見しております。 C言語について質問させて頂きます。 シリアル通信によって受信した1バイトの文字列があるとします。 この文字列のパターンよって処理の分岐をさせたい場合、コードはどのように書けば良いのでしょうか。 より具体的に申しますと、 →文字列パターン1の場合、関数1を呼び出す。 →文字列パターン2の場合、関数2を呼び出す。 →文字列パターン3の場合、関数3を呼び出す。・・・・・・ と、100パターンほどの文字列があり、それぞれにおいて異なる関数を呼び出したいと考えております。私の理解は以下に示す通りなのですが、どうも正しい処理が分らないでいます。 ・受信した文字列がどのパターンなのかを判断するために、strcmp関数で比較を行う。 ・多分岐なので、switch case文かelse if文を用いる。 この場合、条件式の中でstrcmp関数による比較を行えば良いのでしょうか。簡単にコードを示して頂ければ幸いです。C言語初心者なので理解に間違いがあるかもしれませんが、どうぞよろしくお願い致します。

  • C言語 この問題が分かりません!教えてください!

    1.文字をキーボードから入力し、該当するASCIIコードを8進数、10進数、 16進数で出力する。 (printf ,scanfを使用) 2.文字コード(ASCII)を10進数で入力し、そのコードにあてはまる文字を出力。(printf scanf) 1と2は問題は全く別です。 よろしくお願いします。

  • C言語の問題

    配列の問題 1.キーボードから入力したアルファベットの大文字(A~Z)の入力回数をそれぞれ数え、結果を画面出力するプログラムを作成せよ。但し、入力の終了はEOFとし、入力回数のカウントには、配列を用いるものとする。(文字ごとに回数を格納する配列を用意する) 2.キーボードから番号(数字)を入力し、その番号に該当する文字列中の文字を画面表示するプログラムを作成せよ。なお、数字以外の文字が入力した場合と、文字列の範囲外の数字が入力された場合は、任意のメッセージを出力し、再入力するようにする。また文字列はキーボードから入力するものとする。 この問題が解けなくて困ってます。どうか知恵をかしてください。

  • perlの文字列組み合わせ

    perlでプログラムを作成中です。 作成したモノはうまく動かないので掲載できませんが、 どなたかお知恵を貸してください。  入力文字列に対して 1をA、2をB、3をC に置換するプログラムを作成中です。 ただし、全ての組み合わせを出力したいのです。 つまり、”213”と入力すると回答は、 B13 BA3 BAC 2A3 21C 2AC B1C と出力したいのです。  プログラムとしては、入力文字列を1つずつを配列に入れて、それぞれの変換 をかけ、1つずつ組み合わせて出力しているのですが、どうもうまくいきません。 手法は特に固執してませんので、どの様な形でも結構です。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • C言語で文字列の出力の問題

    1行目に文字列aを出力し、2行目にaの各文字を2回づつ出力し、3行目にaの格文字の文字コードを出力する関数 void print_string(char a[]) を作成せよ。 この関数を print_string("abcd") で呼び出したときの出力は abcd aabbccdd 97 98 99 100 となる。 という問題なのですが、2行目と3行目をどうしたら文字列aの文字や文字コードを個別に出力できるのかわかりません。 1行目までしかできてないですが、次のが私の作ったプログラムです。 #include <stdio.h> void print_string(char a[]) { printf("%s\n",a); } int main (void) { print_string("abcd"); return(0); } よろしくお願いします。

  • Cシェルでの文字列大小比較

    Cシェルで set AA="aa" set BB="bb" if( $AA > $BB )then echo "$AA > $BB" endif というような判定がしたいのですが、 上記の場合、”if: 条件式構文が正しくありません”というエラーが出力されます。 Cシェルの場合、文字列の比較は ifでイコールかノットイコールかは判定できますが、文字コードの大小比較が出来ないようですが、 文字列の大小比較をするにはどうすればよいのしょうか

  • C++で文字列の右端から特定の文字までの文字列を

    C++で文字列の中から,文字列の右端から特定の文字までの文字列を取り出すというものを作りたいと思っています。 右端から○文字取り出す。といった感じのコードは書けるのですが、特定の文字まで、というのがどうもうまくいきません。こちら、良いアドバイスをいただける方がいましたらよろしくお願いします。 例:ファイル名を抽出 文字列\system32\notepad.exeからnotepad.exeの部分だけを取り出したい。というものです。 初めに見つけた\まで取り出す・・とやればよいのでしょうが、その方法が今ひとつ良くわからないので、どうかご助力お願いいたします。

専門家に質問してみよう