CString.Format()の件で・・・。

[戻る]
Takeshi 2002/04/26(金) 18:20:58
■動 作 環 境 :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 [E-Mail] 2002/04/26(金) 18:39:07
>String型OBJ.Format("%s",int型変数);
String型OBJ.Format("%d,int型変数);
↑でやってみったらどうですか?

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

merlo 2002/04/26(金) 20:38:22
int型は %d だったような・・・
double型は %f or %e(指数表示)

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

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

Takeshi 2002/04/30(火) 09:29:45
  お世話になっております。

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

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

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

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

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

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

間違っていますかね?

sara 2002/04/30(火) 10:11:18
> %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 2002/04/30(火) 10:31:59
[[解決]]
  どうも、お世話様です。


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

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

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

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

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

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

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