質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.55%

VC++でLPTSTRに何を代入すればいいかわかりません。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 8,967

ofu

score 9

すいません、自作関数averageの結果を表示するプログラムを作りたいのですが...

//プログラムの一部分です

LPTSTR moz;

wsprintf(moz,L"%d",average(6, 8, 5, 7, 4, 5, 7));

TextOut(hdc1n, 0, 0,moz, sizeof moz);


このように、LPTSTRのmoz(文字列を格納するバッファ)に何を代入すればいいかわかりません。

なので、教えてください!

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

とりあえず、このように書いてください。

WCHAR moz[20];
int length = wsprintf(moz, L"%d", average(6, 8, 5, 7, 4, 5, 7));
TextOut(hdc1n, 0, 0, moz, length);


L"%d"という記述から、既定の「Unicode文字セットを使用する」オプションが設定されていると判断します。したがって、Win32 APIで定義されているLPTSTRWCHAR *と同じになります。
ちなみに、WCHARはwchar_tのtypedefですので、`wchar_t moz[20];'と書いても問題ありません。

Win32 APIのwsprintfを含めて、sprintf系関数に渡す「文字列バッファ」には、格納される文字列が充分に収まるサイズの領域を渡す必要があります。したがって、ポインタを渡すのではなく、上記コードのように配列変数として定義した領域を渡してください。

TextOut関数の最後の引数には「文字数」を渡す必要があるので、sizeofで取得できる変数のサイズを渡しても正しく処理されません。wsprintf関数は文字列バッファに格納した文字数を返すので、その値を利用します。C標準関数のwcslenで文字数を取得してもかまいません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/08 17:22

    なるほど、LPTSTRはwchar_t*(WCHAR*)の置き換え版ですかのようなものですか。

    それと、sizeofはあくまでサイズを取得するものであって文字数は取得できないんですね。薄々戸惑ってはいたんですがやはりそうですか。文字数はwcslen関数ですね。

    わざわざコードも書いてくださりありがとうございます!

    キャンセル

+3

Windowsのプログラムをやっていると結構躓く箇所ですね。

いきなりLPTSTRとかLPTCSTRとか出てきてAPI関数の引数とかに指定されているので戸惑う気持ちはわかります。私もそうでしたし、後輩からもよく質問されました。
文字列のポインタをマクロ定義しているだけなので、ルールが判ってくると使いこなせるようになります。

かなりおおざっぱですが、下記のように分解してみると判りやすいです。

LP:ポインタである
T:ビルドオプションによって、char型とwchar_t型に自動で切り替わる文字列
C:const変数
STR:文字列

今回LPTSTRなので、マルチバイト環境だとchar*型、UNICODE環境だとwchar_t*型のポインタ、ということになります。

ただ、上記を理解して場面によって、char*型、wchar_t*型を使い分けるのは面倒なので、文字列を定義したり、変数を宣言したりする際に使えるマクロも用意されています。

_T("abcd")とか、TCHAR buf[32]とかの記述がそれです。固定文字の場合_T("")で宣言してやると自動でchar型またはwchar_t型に切り替わります。変数もTCHARで宣言してやると自動で切り替わるので、特に意識せずにAPI関数への引数に渡してやることができます。

Windows環境以外に使用しないコードであれば、上記マクロを積極的に使うと、文字列の型で悩むことが少ないと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/08 17:17

    ありがとうございます!

    やはり、ここはほとんどのプログラマーの方が戸惑うところでしたか。

    しかし、意味が分かってよかったです。名前にも、由来っていうのがありますからね。

    将来くらいに自作言語を作る際は気を付けたいです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.55%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る