プロが教える店舗&オフィスのセキュリティ対策術

あいうえお(5)かきく(8)けこ
という文字列の
”(数字)”を別の文字列”さささささ”
に変えたいんです。
(つまり、正解は
あいうえおさささささかきくさささささけこ)

replace関数を使ってみようと思ったのですが、
string型のものならば、
(開始場所、変えたい文字数、変えたい文字列)
を引数にすればいいのはわかるのですが、
これを、CStringでやりたいのです。
ヘルプを見てもCStringのreplace関数は
(変更前の文字列、変更後の文字列)を引数にする、
となっていて、私のように(数字)というアバウトな場合にはむかないのかとも思いますが、他のプログラムとの関係で、CString型がいいのです。

ややこしくてすいませんが、アドバイスお願いいたします。

A 回答 (3件)

ごめんなさい。

No.1のコードはボロボロですね。(括弧外の数字まで削ったりとか…)
なので改めて。でも、このやり方もいまいちな気がするな…
もっとスマートに処理したいと思ったら、正規表現ライブラリの利用になりますかね。

CString strSrc("あいうえお(5)かきく(8)けこ");
CString strNew("さささささ");

TRACE("%s\n", strSrc);
int nLeft = 0;
int nRigh = 0;
while ((nLeft = strSrc.Find('(', nLeft)) != -1) {
  if ((nRight = strSrc.Find(')', nLeft + 1)) == -1) {
    // 閉じ括弧無し
    nLeft++;
    continue;
  }
  // 括弧内の文字列を判定する
  int nCount = nRight - nLeft - 1;  // 括弧内の文字数
  int nMatch = 0;
  for (int i = nLeft + 1; i < nRight; i++) {
    if ('0' <= strSrc[i] && strSrc[i] <= '9') {
      nMatch++;
    }
  }
  // 括弧内が全て数字だった場合置換する
  if (nCount > 0 && nMatch == nCount) {
    strSrc.Delete(nLeft, nCount + 2);  // +2は括弧の分
    strSrc.Insert(nLeft, strNew);
    TRACE("%s\n", strSrc);
    nLeft += strNew.GetLength();
  } else {
    nLeft++;
  }
}
TRACE("%s\n", strSrc);

参考URL:http://www.s34.co.jp/cpptechdoc/article/regexpp/
    • good
    • 1
この回答へのお礼

細かい修正までありがとうございます!!
教えていただいたプログラムを参考に、
完成させることが出来ました。
C++の関数をちゃんと理解していないので、strchrとか使ったものになってしまいましたが・・・;
これから勉強して、よりC++らしいものが書けるようにしたいと思います☆
ありがとうございました!

お礼日時:2005/10/06 15:46

string::replaceと同等なことが行いたいのなら


CString::DeleteとCString::Insertを組み合わせれば可能です。
    • good
    • 1

とりあえず思いついたのは、「数字を削って括弧を置換する」という処理ですね。


数字や括弧に全角を使いそうな場合はもうちょい処理を増やす必要がありますが。

CStringstr("あいうえお(5)かきく(8)けこ");
TRACE("%s\n", str);
intnIndex;
while ((nIndex = str.FindOneOf("0123456789")) != -1) {
str.Delete(nIndex);
TRACE("%s\n", str);
}
str.Replace("()", "さささささ");
TRACE("%s\n", str);
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A