数値を文字列にするには?

解決


Kuro  2004-05-13 08:51:06  No: 53632

乱数をpに格納して、それをTextOutで表示したいのです。
文字列の表示はできるのですが、数値をどうやってTextOutで表示するのか分かりません。
VCでWin32アプリケーションを作ろうかと思っています。
下は、case WM_PAINT以下です。この部分と、time.hをインクルードするということ程度しか初期段階から変更していませんので、その部分のみ書きました。

  case WM_PAINT:

    srand((unsigned)time(NULL));

    int p;
    p = rand();
    char* buff;
    buff = 0;
    wsprintf( buff,"%d",&p);

    hdc = BeginPaint(hWnd, &ps);
    
    TextOut(hdc,10,10,buff,strlen(buff));

    EndPaint(hWnd, &ps);
    break;

このようなソースを作りました。これを実行すると、「書き込み中にアクセス違反が発生しました」と出てしまいます。wsprintfに問題があるのではないかと思っています。ですが、解決策・原因が分かりません。分かっている方には簡単な質問で面倒かとは思いますが、どうぞよろしくお願いいたします。


Toshi  2004-05-13 08:58:38  No: 53633

未だポインターとメモリアロケートの仕組みを理解していないと見ました。

一度C言語入門のWEBサイトで基本をじっくり覚える事をお奨めします。


monkey  2004-05-13 15:59:45  No: 53634

数値を変換した文字列を格納できるだけの容量(バイト数)のバッファを用意する必要があります.
現在のコードでは,ポインタ(buff)が指すべきバッファの実体がどこにもありません.


シャノン  2004-05-13 16:03:05  No: 53635

char * は文字列ではありません。
「どこかにある文字列の場所を指し示しているもの」です。
wsprintf に char * を渡すということの意味は「この先にある文字列に書き込んでくれ」と言っているのと同じことです。

で、これ。
> buff = 0;
> wsprintf( buff,"%d",&p);
ポインタにゼロを代入するということは、そのポインタは「どこも指していない」ということを意味します。
そんなものを wsprintf に渡したら、wsprintf はどこに書き込んだらいいのかわからなくてアクセス違反が発生してしまうのです。


たく  2004-05-13 19:08:48  No: 53636

あと、
> wsprintf( buff,"%d",&p);
wsprintf( buff,"%d",p);
ですよね、たぶん


Kuro  2004-05-15 02:22:27  No: 53637

皆さんの書き込みを元にいろいろ考え、ポインタを見直し、何とかできました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加