CStringで%が消える

[戻る]
いいむら 2005/04/25(月) 19:48:53
以下のプログラムで問題があります。

CString str1, str2;
str.LoadString(IDS_FOO);
str2.Format("[%s]", str); 
(IDS_FOOは"%")
printf(str);

理想としては
[%]
と表示されて欲しいのですが、

[]
になります。

IDS_FOOを"%%"とすれば
表示されます。

IDS_FOOは単位を格納してるので
"%%"
とするとおかしな感じがします。

なんとか元データが"%"で
出力を[%]とする方法はありませんか?

出きれば以下のようなのは避けたいです。
if( strcmp(str, "%") == 0 )
  str += "%";

am 2005/04/25(月) 20:06:29
str2.Format("[%s]", (LPCTSTR)str); 

printf等でもそうですが、可変引数にCStringを渡してもoperator LPCTSTR()が呼ばれず
CStringオブジェクトそのものを渡そうとするので注意です。

Kerry 2005/04/25(月) 20:20:44
> printf(str);

printf("%s", str);

とすればよいかと思います。

REE 2005/04/25(月) 20:21:17
下記でもOKです。
printf("%s",(LPCTSTR)str);

printfやFormatの第一引数に%を含む文字列を直接指定すると書式として扱われるので、
注意が必要です。

Kerry 2005/04/25(月) 20:36:01
補足ですが、

> printf等でもそうですが、可変引数にCStringを渡しても
> operator LPCTSTR()が呼ばれず
> CStringオブジェクトそのものを渡そうとするので注意です。

現在のCStringは、このような場合でもうまく動くように
設計されています。
(MFCインターナル(ISBN4-7952-9695-2)に詳しく書かれています)

もちろん、明示的なキャストを行うことは適切な処置ですので、
それに関して異論があるわけではありません。

いいむら 2005/04/25(月) 20:53:06
[[解決]]
なるほど。
さらに%sですか。

ありがとうございます。

RAPT 2005/04/28(木) 02:00:08
> > printf等でもそうですが、可変引数にCStringを渡しても
> > operator LPCTSTR()が呼ばれず
> > CStringオブジェクトそのものを渡そうとするので注意です。
> 
> 現在のCStringは、このような場合でもうまく動くように
> 設計されています。
> (MFCインターナル(ISBN4-7952-9695-2)に詳しく書かれています)
ここで言われている「現在のCString」とはどのバージョンのことを指しているか
教えていただけないでしょうか。

Kerry 2005/04/28(木) 09:31:48
> ここで言われている「現在のCString」とはどのバージョンのことを指しているか
> 教えていただけないでしょうか。

MFCインターナルによると、CStringクラスに参照カウントが導入されたMFC4.0
からだそうです。

MFC3.0以前では、CStringクラスに文字列データ以外の4バイトが含まれているため、
キャストを行わなければprintfは正しく処理できない、とあります。

古いスレッドには追加発言できません。