• ベストアンサー

ポインタを用いた文字列操作について…。

C初心者です。 「ある文字列を読み込んだ後、その文字列中にある文字(複数)を指定する。指定した文字を最初の文字列から消す」という関数を作りたいのですが、うまくいきません。 例を挙げると、 文字列 :OshieteGoo 指定文字:to 文字列改:OshitG のような感じにしたいです。 #define NULLC '\0' void strCpy(char *ptr1, char *ptr2, char *cMain) { char *cSub = cMain; /* ポインタバックアップ */ for(;*ptr1!=NULLC;ptr1++){ for(cSub=cMain;*cSub!=NULLC;*cSub++){ if(*ptr1!=*cSub){ *ptr2 = *ptr1; ptr2++; } break; } } *ptr2 = NULLC; return; } 自分なりにこう考えてみたのですが、これを実行すると 文字列 :OshieteGoo 指定文字:to 文字列改:OshitGoo となり、指定文字の2文字目以降がうまく削除できません…。 この問題を解決できるお知恵を拝借させて頂けると幸いです^^;

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

> 文字列 :OshieteGoo > 指定文字:to > 文字列改:OshitG んと、この場合 't' と 'o' を消したいのではないですか? なぜ文字列改のほうに 't' が残っていて、'e' が消えているのでしょうか? でまあそれはそれとして、 ptr2 がどういう変化をしているか追いかけてみては? char *src = ptr1; char *dst = cMain; char *delete; for (; *src; src++) { for (delete = ptr2; *delete; delete++) { if (*delete == *src) break; } if (!*delete) *dst++ = *src; } *dst = NULLC;

num_ruke
質問者

お礼

>なぜ文字列改のほうに 't' が残っていて、'e' が消えているのでしょうか? すいません、間違えました。ゴメンナサイ…。 >ptr2 がどういう変化をしているか追いかけてみては? そうですよね。2文字目以降ですもんね。。 もう一度考えてみます。ありがとうございました。

その他の回答 (2)

回答No.3

#include <stdio.h> #include <string.h> void delchars(char *str1, const char *str2, const char *chars) { while(*str1 = *str2){ str1 += (strchr(chars, *str2) == NULL); str2 ++; } } int main(void) { char str1[32]; char *str2 = "OshieteGoo"; char *chars = "to"; puts(str2); puts(chars); delchars(str1, str2, chars); puts(str1); return 0; }

num_ruke
質問者

お礼

回答ありがとうございます! 参考にさせて頂いてもっと精進します;;

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

まずは関数名と、引き数の名前を「わかる名前」に変更して下さい。 次に元の文字列(例では OshieteGoo)と指定文字列(例では to)は関数によって変更されないので const を付けて下さい。 雰囲気こんなん void strCutCopy(const char* source, char* dest, const char* cut); ある文字が文字列に現われるかどうかは、strchr() などを利用するのがてっとり早いでしょう。

num_ruke
質問者

お礼

>const,strchr() こんなのがあったんですか。。 勉強不足を痛感します;; ありがとうございました!!

関連するQ&A

専門家に質問してみよう