CStringで%が消える – プログラミング – Home

通知
すべてクリア

[解決済] CStringで%が消える


いいむら
 いいむら
(@いいむら)
ゲスト
結合: 20年前
投稿: 2
Topic starter  

以下のプログラムで問題があります。

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
 am
(@am)
ゲスト
結合: 23年前
投稿: 13
 

str2.Format([%s], (LPCTSTR)str);

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


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

> printf(str);

printf(%s, str);

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


返信引用
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

下記でもOKです。
printf(%s,(LPCTSTR)str);

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


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

補足ですが、

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

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

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


返信引用
いいむら
 いいむら
(@いいむら)
ゲスト
結合: 20年前
投稿: 2
Topic starter  

なるほど。
さらに%sですか。

ありがとうございます。


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

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


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

> ここで言われている「現在のCString」とはどのバージョンのことを指しているか
> 教えていただけないでしょうか。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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