3

次のコードがあります。

LPCTSTR strPermission = Method();

if (strPermission == L"0")
{
    return true;
}
else
{
    return false;
}

デバッグ中に、strPermission が「0」に等しいことがわかりますが、if ステートメントのように比較すると、常に false が返されます。

私が考えることができる唯一のことは、変数の値ではなく変数のメモリアドレスを比較していることです。

strPermission が "0" に等しい場合に true を返すように、strPermission を L"0" と比較するにはどうすればよいですか。

ありがとうございました!

4

3 に答える 3

3

C ランタイム ライブラリ関数を使用する必要があります。strcmpANSI 文字列をwcscmp比較し、UNICODE 文字列を比較します。

次のように使用します。

bool match = wcscmp(strPermission, L"0") == 0;
于 2012-03-20T23:26:32.770 に答える
1

C または C++ では、そのような C スタイルの文字列を比較することはできません。このC FAQ の質問と回答を確認してください。

探している関数は と呼ばれlstrcmpます。

于 2012-03-20T23:25:36.737 に答える
0

LPCTSTRの配列へのポインタですconst wchar_tstrPermission配列の最初の文字を指します。 L"0"の配列である文字列リテラルでありconst wchar_t、 のポインターに減衰しますconst wchar_t。しかし、ポインターは等しくなく、異なる配列を指しています。これが、私たちが C++ を発明した理由です。ご利用ください。

std::wstring strPermission = Method();
return (strPermission == L"0"); //works like magic!

または、Method保持しなければならないものを返す場合は、少なくともこれを行います

std::unique_ptr<wchar_t[]> strPermission = Method();
return (std::wcscmp(strPermission.get(), L"0")==0); 
//wcscmp is for comparing strings, but returns 0 if they're equal.

strPemissionまた、ゼロ文字の後にヌル文字が続く配列を指していると確信していますか? そうでなく、 を使用していない場合はwstring、それが配列を指していることも確認する必要があります

if (strPermission)
     //do stuff
else
     //its a NULL pointer.

LPCTSTRの型は実際にはコンパイラ オプションに依存することを指摘するように chris に勧められました。あなたのコードから、あなたが_UNICODEset でコーディングしていることがわかりconst wchar_t*ます。_tcscmpのリテラルを_T("0")持ち、それらは の配列になりますTCAHR。文字列については、どこかに typedef を追加する必要があります。

#ifdef _UNICODE
    typedef std::string std::tstring 
    //you'll probably have to add more t helper functions here
#else
    typedef std::string std::wstring
    //you'll probably have to add more t helper functions here
#endif

コードが常に あることを確認したい場合(これは私が行っていることです)、 .の代わりに_UNICODE明示的に呼び出します。(対応する もありますが、それを呼び出す理由はあまりありません)。MethodW()Method()MethodA()

マクロもありUNICODEますが、常にマクロと同じである必要があります_UNICODE。(これらを自分で定義しないでください。プロジェクト オプションに属します)。

于 2012-03-20T23:26:24.883 に答える