環境はVisualStudio C++ 2005です。
CString csSrc;
csSrc = 私は[@A]月[@B]日に、[@C]gで生まれました;
上記文字列中の
[@A]を12に、
[@B]を2に、
[@C]を3000に置き換え、
私は12月2日に、3000gで生まれました
という文章にしたいです。
CString csDst;
int aLen,bLen,cLen;
aLen = csSrc.Find([@A]);
bLen = csSrc.Find([@B]);
cLen = csSrc.Find([@C]);
if(aLen < bLen && aLen < cLen)
{
csDst += csSrc.Left(aLen);
}
これを3要素分繰返し、取得したFindで取得したLenが-1になるまで繰り返す、
といった処理です。
このような方法しか思いつかなく、何だかマヌケな感じなので、
もっとスマートに出来ないかという相談をさせていただきたく投稿いたしました。
ご教授お願いいたしますm(__)m
@A, @B, @C の順序が重要ってこと?
それだけなら、わざわざ作らなくても、
CStringT::FormatMessage()でできます。
ご回答ありがとうございました。
ググってみたんですが、使い方がよく分かりません・・・
どこか参考になるサイトで構いませんのでご存知ではないでしょうか?
標準関数のprintfの使い方が解っていれば、
使い方が良く解りませんと言う事は無いと思います。
printfの使い方もご存じないですか?
もしそうならprintfの使い方について勉強されたほうが
良いと思います。printfに関してであれば、情報は
あふれるくらいあると思いますよ。
追伸
MSDNを見て解らないと言われているのかもしれませんが、
最終的にはMSDNがMicrosoftが出している公式資料になるので
最初は難しくてもこれを理解できるように勉強をした方が
良いと思います。
C++言語の知識とかWindowsの知識とかいろいろ要りますが、
結局はWindows上でアプリを開発するには必要な知識なので
遅かれ早かれ勉強する事になりますから。
単純にCString::Replaceではだめ?
「独自の方法」で、やらなければいけなくなった理由を詳しく説明すると
別の解法も出てくるかもしれません。
たとえば、
理由:[@B]が不特定回数出現するから。
等ですね。
もっとも、この場合Blueさんの発言が、回答になっちゃいますけど(vv;)。
Replace だと、対象も text でなきゃならないので微妙に不便かも・・・
FormatMessage は同一項目の複数回の出現を認めているので
void func() {
CString s;
s.FormatMessage(_T(%3!s! %2!d! %1!.2s! %2!-3.2d! %3!6.5s! %1!s! %4!*.*d!),
_T(Text), 2, _T(a), 8, 3, 4);
_tprintf(_T(%s\n), s);
}
は問題なく動作するっつことで。
(FormatMessage では浮動小数点数が使えないが)