CString.Format()の件で・・・。 – プログラミング – Home

通知
すべてクリア

[解決済] CString.Format()の件で・・・。


Takeshi
 Takeshi
(@Takeshi)
ゲスト
結合: 23年前
投稿: 83
Topic starter  

■動 作 環 境 :Windows2000
■開 発 環 境 :Visual C++6.0

お世話になってます。

表記の通りですが、CString.Format() についてですが

int 型の変数の値をCString に代入したいのです。

CString型OBJ.Format(%s,int型変数);

とやっているのですが、実行させると (MSVCRTD.DLL) で例外となってしまいます。
ファイルは OUTPUT.C という所で止まります。
これは MFCの関数なので何をやっているやらさっぱりなのですが・・・。

/* UNDONE: handle '#' case properly */
/* scan for null upto i characters */

#else /* _UNICODE */

if (flags & (FL_LONG|FL_WIDECHAR))
{
if (text.wz == NULL) /* NULL passed, use special string */
text.wz = __wnullstring;
bufferiswide = 1;
pwch = text.wz;

while ( i-- && *pwch )
++pwch;
textlen = pwch - text.wz;
/* textlen now contains length in wide chars */
}
else
{
if (text.sz == NULL) /* NULL passed, use special string */
text.sz = __nullstring;
p = text.sz;
→ while (i-- && *p)
++p;
textlen = p - text.sz; /* length of the string */
}

→ の部分で停止しているんですよ。

Formatの使い方が間違っているでしょうか?


引用未解決
トピックタグ
kng
 kng
(@kng)
ゲスト
結合: 23年前
投稿: 10
 

>String型OBJ.Format(%s,int型変数);
String型OBJ.Format(%d,int型変数);
↑でやってみったらどうですか?

ついでに
http://www.microsoft.com/JAPAN/developer/library/vcmfc/_mfc_cstring.3a3a.format.
htm
↑ここも見てみたらどうでしょう。


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

int型は %d だったような・・・
double型は %f or %e(指数表示)

いろいろあります.うまく対応させて使うところです.
C言語の本を参考にすると載っていると思われます.


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

>String型OBJ.Format(%s,int型変数);
 %sにすると、int型変数の値をアドレスとみて、そのアドレスにある文字列であるはずのデ
ータにアクセスしようとしてしまいます。ですから、ほとんどの場合メモリアクセス例外が発生
するでしょう。
 出力形式はC言語のprintfやsprintf関数で学習する事柄ですね。
 C言語辞典などを1冊持っていると便利ですよ。


返信引用
Takeshi
 Takeshi
(@Takeshi)
ゲスト
結合: 23年前
投稿: 83
Topic starter  

お世話になっております。

int 型の変数の値をCString に代入したい時は、

CString型OBJ.Format(%s,int型変数);

「この文字列型OBJに、int型の変数の値を 文字列 に変換して代入する」

という意味ですよね。C の sprintf文 と同じという事は。

であれば、%s は文字列ですからやはり %s で正しいのではないですか?

int型 → 文字列型 への変換後代入ですよね?

間違っていますかね?


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

> %s は文字列ですからやはり %s で正しいのではないですか?
 %sは文字列変数に対してのみ使用できます。上記のアドレスになってしまうという説明は分か
りにくかったですか?
> int型 → 文字列型 への変換後代入ですよね?
 変換するために%dでint型変数が数値であることを指定しているのです。
 サンプルを載せておきましたので試してみてください。

int a=10;
const char s[] = abcdefg;
long adr = (long)s; // 文字列「abcdefg」のアドレス

printf(%s\n, s ); // 出力結果:「abcdefg」
printf(%d\n, adr ); // 出力結果:「6818600」(数値が違うこともあります)
printf(%s\n, adr ); // 出力結果:「abcdefg」
printf(%d\n, a ); // 出力結果:「10」
// printf(%s\n, a ); // メモリアクセス例外発生


返信引用
Takeshi
 Takeshi
(@Takeshi)
ゲスト
結合: 23年前
投稿: 83
Topic starter  

どうも、お世話様です。

つまりこういう事ですか。

CString型OBJ.Format(%?,変数);

の場合、代入後の型は文字列型で決定しているのだから

あくまで Format で指定するのは、代入(変換)元の型を記述するって事ですね。

それは sprntf 文の時から完全に誤解しておりました。
てっきり ”何に変換するのか ”を指定するものだと思っておりました。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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