CStringのFormatのような処理を独自の識別子で行いたい – プログラミング – Home

CStringのFormatのような処...
 
通知
すべてクリア

CStringのFormatのような処理を独自の識別子で行いたい


ただめ
 ただめ
(@ただめ)
ゲスト
結合: 14年前
投稿: 2
Topic starter  

環境は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


引用解決済
トピックタグ
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

@A, @B, @C の順序が重要ってこと?
それだけなら、わざわざ作らなくても、
CStringT::FormatMessage()でできます。


返信引用
ただめ
 ただめ
(@ただめ)
ゲスト
結合: 14年前
投稿: 2
Topic starter  

ご回答ありがとうございました。

ググってみたんですが、使い方がよく分かりません・・・

どこか参考になるサイトで構いませんのでご存知ではないでしょうか?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

標準関数のprintfの使い方が解っていれば、
使い方が良く解りませんと言う事は無いと思います。

printfの使い方もご存じないですか?
もしそうならprintfの使い方について勉強されたほうが
良いと思います。printfに関してであれば、情報は
あふれるくらいあると思いますよ。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

追伸
MSDNを見て解らないと言われているのかもしれませんが、
最終的にはMSDNがMicrosoftが出している公式資料になるので
最初は難しくてもこれを理解できるように勉強をした方が
良いと思います。

C++言語の知識とかWindowsの知識とかいろいろ要りますが、
結局はWindows上でアプリを開発するには必要な知識なので
遅かれ早かれ勉強する事になりますから。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

単純にCString::Replaceではだめ?


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

「独自の方法」で、やらなければいけなくなった理由を詳しく説明すると
別の解法も出てくるかもしれません。
たとえば、
 理由:[@B]が不特定回数出現するから。
等ですね。
もっとも、この場合Blueさんの発言が、回答になっちゃいますけど(vv;)。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

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 では浮動小数点数が使えないが)


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました