初歩的な質問ですみません。
次のような方法で正しく文字列を比較できますでしょうか?
C言語
1TCHAR buf[256]; 2 3//取得 4GetDlgItemText(hWnd, EDIT, (LPTSTR)buf, (int)sizeof(buf)); 5 6//比較時 7int result = strcmp(buf, "593"); 8
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/17 21:56
回答2件
0
ベストアンサー
こんにちは。
細々違っています。
まず、TCHAR型は、Visual C++固有の型です。プロジェクトのプロパティの全般にある「文字セット」の設定が、「マルチ バイト文字セットを使用する」ならchar型、「Unicode 文字セットを使用する」ならwchar_t型になります。前者は1バイト、後者は2バイト(Visual C++の場合)です。
GetDlgItemText()のnMaxCountは「 TCHAR 単位で指定します」ですから、バイト単位で結果を返すsizeofでは不適切です。
(int)(sizeof(buf)/sizeof(TCHAR))
のような記述をすると文字セットがどちらの場合でも対応できます。
同様にstrcmp()ではなく_tcscmp()を使った方が好ましいです。
最後に文字定数も同じ問題があります。"abc"はchar型文字列です。L"abc"はwchar_t型文字列です。両者を切り替えるマクロとしてTEXT()があります。
【余談ですが】
C++で取り扱う文字コードとして何を使うのか、結構悩ましいです。
MicrosoftはUTF-16を推奨しています。linuxではUTF-8がデフォルトです。
Visual C++では「Unicode 文字セットを使用する」時UTF-16となります。「マルチ バイト文字セットを使用する」の時は残念ながらShift-JISです。UTF-8も扱うことも可能です。
Windows専用ソフトならUTF-16にしておいた方が無用なトラブルに巻き込まれないです。ただし、UTF-16非サポートなライブラリは多々ありますから、それらを使う時たいへん面倒な思いをします。
マルチ・プラットフォーム対応する場合はUTF-8に統一するのがベストかも知れません。Windowsではちょっと面倒ですが、対策は可能です。何と言ってもUTF-16非対応なライブラリを使う時の苦労が大きく減ります。
投稿2017/02/18 01:36
編集2017/02/18 02:56総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
追記:Chironianさんが的確な回答をしてくださっていると思います。自分の回答に漏れていた点も含まれていますので、Chironianさんの回答をご覧いただければ充分と思います。
結論からするとMBCSモードでコンパイルしているなら動くかもしれないけどコーディングとしては正しくないと思います。
昔の記憶ですが・・・LPTSTR/LPCTSTRの意味は
- ユニコードモードでコンパイル
wchar_t型で中身がUTF16となる
- MBCSモードでコンパイル
マルチバイトエンコードされた文字列で日本語WindowsだとWindows-31J(code page 932、わたしはMicrosoft独自Shift JISと呼んでます)になったような気がします。
問題1:定数はLPCTSTRとして扱うべきなので(確か)_T("593")とすべきだったような気がします。
問題2:strcmpってchar前提の関数だと思うのでLPTSTR/LPCTSTRを比較するなら専用の関数(_tcscmp?)を使わなければNGだった気がします。
昔のことを思い出しつつ書いてます。間違いなどあったらご容赦を。
正確な仕様は検索すれば出てくる気がしますが、この辺りを正確に把握しないで物を書いているページも多々あった気がする(それも昔の話です・・・すみません)のでしっかり書いてあるページを見ないと危険かも・・・
投稿2017/02/17 17:35
編集2017/02/18 04:32総合スコア18392
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/18 03:01
2017/02/18 04:29
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。