CString

CStringは文字列を扱うATL/MFC共有クラス・・・。

CStringT クラス

正確にはCStringTだが、CStringでもTCHAR対応で自動で切り替わるようになってて普通に使えるので、これで・・・。

今回は、C++標準ライブラリのstring(std::string)の頁で作ったプログラムのCString版を作る・・・。
コンソールアプリケーションなので、MFCだけど、[Win32 コンソール アプリケーション]で作る・・・。

f:id:BG1:20150415104514p:plain

で、空のプロジェクトにしておく・・・。

f:id:BG1:20150415104718p:plain

プロパティで、

f:id:BG1:20150415105013p:plain

[MFCの使用]を見ると、[標準 Windows ライブラリを使用する]になっているので、

f:id:BG1:20150415105332p:plain

[スタティック ライブラリで MFC を使用する]にする・・・。

でプログラムは、

標準入出力をするので、"stdio.h"をインクルードしている・・・。

main関数のTCHAR版である_tmain関数を定義している・・・。
(引数とかよくみるとTCHARになってるね・・・。)

TCHARの文字配列、そして4つのCStringを用意・・・。
CStringでは、初期化を引数付きのコンストラクタで行うこともできるし、従来通り'='演算子で行うこともできる・・・。
(まあ、これはstd::stringでもできるけど・・・。)

とりあえずこの状態で出力・・・。(1)

CStringのインスタンスは_tprintfの引数に直接渡せる・・・。
これは、std::stringにはできない・・・。
(ただし、c_str()メンバ関数を使って間接的に文字列を渡すことはできるけど・・・。)

次に、'='演算子で文字列を代入してみる・・・。

cstrStr1に"ABC"を代入・・・。

で、また出力・・・。(2)

今度は、cstrStr2にcstrStr1を代入・・・。

で、また出力・・・。(3)

次は文字列の連結・・・。

cstrStr2にcstrStr3を連結・・・。

そして、

また出力・・・。(4)

最後は文字列を入力してもらって、それをcstrStr2と比較して同じ文字列かどうかを判定する・・・。

_tscanfにcstrInputは直接渡せないので、tszInputでワンクッションおいている・・・。
cstrInputに代入したら、比較演算子でcstrStr2と比較し、結果を表示・・・。(5)

コンソールアプリを実行する場合は、[デバッグなしで開始]のほうが、プログラムが終了してもコマンドプロンプトを閉じないので、そっちのほうがいい・・・。

f:id:BG1:20150415112814p:plain

実行すると、

cstrStr1 =
cstrStr2 = ABCDE
cstrStr3 = XYZ

cstrStr1 = ABC
cstrStr2 = ABCDE
cstrStr3 = XYZ

cstrStr1 = ABC
cstrStr2 = ABC
cstrStr3 = XYZ

cstrStr1 = ABC
cstrStr2 = ABCXYZ
cstrStr3 = XYZ

cstrInput: ABC
cstrInput( = ABC) != cstrStr2( = ABCXYZ)
続行するには何かキーを押してください . . .

一致しない場合はこうなる・・・。
改行で区切られてるそれぞれの処理が(1)~(5)の結果・・・。
「続行するには何かキーを押してください . . .」はコンソールが勝手に出しているものなので、気にしない・・・。
何かキーを押したら、コマンドプロンプトを閉じるけど・・・。

一致する場合は、

cstrStr1 =
cstrStr2 = ABCDE
cstrStr3 = XYZ

cstrStr1 = ABC
cstrStr2 = ABCDE
cstrStr3 = XYZ

cstrStr1 = ABC
cstrStr2 = ABC
cstrStr3 = XYZ

cstrStr1 = ABC
cstrStr2 = ABCXYZ
cstrStr3 = XYZ

cstrInput: ABCXYZ
Match! cstrInput( = ABCXYZ) == cstrStr2( = ABCXYZ)
続行するには何かキーを押してください . . .

こうなる・・・。

Sample/CString_.cpp at master · bg1bgst333/Sample · GitHub