以下のプログラムで問題があります。
CString str1, str2;
str.LoadString(IDS_FOO);
str2.Format([%s], str);
(IDS_FOOは%)
printf(str);
理想としては
[%]
と表示されて欲しいのですが、
[]
になります。
IDS_FOOを%%とすれば
表示されます。
IDS_FOOは単位を格納してるので
%%
とするとおかしな感じがします。
なんとか元データが%で
出力を[%]とする方法はありませんか?
出きれば以下のようなのは避けたいです。
if( strcmp(str, %) == 0 )
str += %;
str2.Format([%s], (LPCTSTR)str);
printf等でもそうですが、可変引数にCStringを渡してもoperator LPCTSTR()が呼ばれず
CStringオブジェクトそのものを渡そうとするので注意です。
> printf(str);
printf(%s, str);
とすればよいかと思います。
下記でもOKです。
printf(%s,(LPCTSTR)str);
printfやFormatの第一引数に%を含む文字列を直接指定すると書式として扱われるので、
注意が必要です。
補足ですが、
> printf等でもそうですが、可変引数にCStringを渡しても
> operator LPCTSTR()が呼ばれず
> CStringオブジェクトそのものを渡そうとするので注意です。
現在のCStringは、このような場合でもうまく動くように
設計されています。
(MFCインターナル(ISBN4-7952-9695-2)に詳しく書かれています)
もちろん、明示的なキャストを行うことは適切な処置ですので、
それに関して異論があるわけではありません。
なるほど。
さらに%sですか。
ありがとうございます。
> > printf等でもそうですが、可変引数にCStringを渡しても
> > operator LPCTSTR()が呼ばれず
> > CStringオブジェクトそのものを渡そうとするので注意です。
>
> 現在のCStringは、このような場合でもうまく動くように
> 設計されています。
> (MFCインターナル(ISBN4-7952-9695-2)に詳しく書かれています)
ここで言われている「現在のCString」とはどのバージョンのことを指しているか
教えていただけないでしょうか。
> ここで言われている「現在のCString」とはどのバージョンのことを指しているか
> 教えていただけないでしょうか。
MFCインターナルによると、CStringクラスに参照カウントが導入されたMFC4.0
からだそうです。
MFC3.0以前では、CStringクラスに文字列データ以外の4バイトが含まれているため、
キャストを行わなければprintfは正しく処理できない、とあります。