【Win32】文字列はどの型を使えばいいの?とりえあずTCHARでオッケー!

C++アイコン C++

LPCWSTRとかLPSTRとか、いろいろありすぎてよくわからないWin32の文字列型。

初心者はとりあえずTCHARだけ覚えておきましょう。

混乱を避けるため、あえて理屈抜きで、Win32の文字列型についてシンプルにまとめてみました。

スポンサーリンク

Win32の文字列型は難しい

Win32は古くからの歴史を受け継いでいるため、文字列型がたくさんあります。

Windows API/基本データ型と文字列 - WisdomSoft
Windows API における基本データ型は、標準 C のキーワードを使いません。実際のデータ型にマッピングされたマクロを用います。特に、文字型はワイド文字とマルチバイト文字を設定で切り替えられる汎用テキストマッピングと呼ばれる仕組みを採...

「ワイド文字とかマルチバイト文字とか、よくわからん。とりあえず動かしたい!どれを使えばいいの?」という人もいるでしょう。

スポンサーリンク

文字列のキホンはTCHAR

早速、結論です。

文字列型の変数を用意したいときは、とりあえずTCHARで定義しておけばよいです。

TCHAR str[256];

TCHARで定義しておけば、関数側が要求する型がLPWSTRでもLPCWSTRでも、そのまま投入できます。

あと、文字列を定義するときは必ず[256]のように長さも書くことが必要です。

これさえおさえておけば、ほかの言語とほぼ同様に文字列変数を扱うことができます。

変数の初期化

文字列型の変数(TCHAR)を初期化するには、以下のようにします。

TCHAR hoge[256]= _T("hogehoge!");

_Tというマクロを使います。TEXT(“”)でも一緒です。日本語も変数に格納することができます。

文字列を代入する

TCHARに文字列を代入するには、wsprintfを使います。

TCHAR hoge[256];
wsprintf(hoge, _T("%s"), _T("hogehoge!"));

これもほぼお決まりのパターンですので、そのまま覚えてしまいましょう。

変数を文字列として代入する

変数(例えばINT型など)を文字列として代入したいときも、wsprintfを使います。

TCHAR hoge[256];
wsprintf(hoge, _T("%d"),123 );

▲これを実行すると、hogeは“123”という文字列が入ります。

複数の変数を代入することもできます。

TCHAR hoge[256];
wsprintf(hoge, _T("%d%d"),123,345 );

▲これを実行すれば、hogeは“123345”という文字列となります。

文字列と組み合わせることもできます。

TCHAR hoge[256];
wsprintf(hoge, _T("変数は%d%d"),123,345 );

▲これを実行すれば、hogeは“変数は123345”という文字列となります。

上記コードでの%dはフォーマット指定子と呼ばれるものです。引数に指定された変数をどういう形式で表示するかを指定できます。

フォーマット指定子変数
%dまたは%i数値
%s文字列
よく使うフォーマット指定子

ほかのフォーマット指定子については、Microsoftのホームページに掲載されています。

書式指定構文: 'printf' および 'wprintf' 関数
Microsoft C ランタイムの "printf" 関数と "wprintf" 関数の書式設定指定子の構文について説明します

関数から文字列を取得する

Win32の関数から文字列を取得したいときも、TCHARで大丈夫です。

TCHAR PATH[260];
GetCurrentDirectory(260, PATH);//カレントディレクトリのパスを格納

Win32の関数は通常は文字列型をLPCWSTR型で返します。この場合もTCHARで定義した変数に値を格納することができます。あまり考えずにTCHARで変数を用意しましょう。

メッセージボックスに変数を表示する

取得したTCHAR型の変数は、メッセージボックスにそのまま表示できます。

TCHAR hoge[256];
wsprintf(hoge, _T("%s"), _T("hogehoge!"));
MessageBox(NULL, hoge, hoge, NULL);

便利です。

とりあえずTCHARを覚えよう

TCHARはうまいことできている文字列型で、環境にあった文字列型を自動的に選択してくれるようになっています。

ですので、とりあえずTCHARで定義しておけばだいたい動きます。

あとはプログラミングしながら、違いを覚えていけばいいと思います。

コメント

タイトルとURLをコピーしました