3

我有以下代码:

LPCTSTR strPermission = Method();

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

在调试时,我可以看到 strPermission 确实等于“0”,但是当我像在 if 语句中那样比较它时,它总是返回 false。

我唯一能想到的是它是比较变量的内存地址而不是变量值。

如何将 strPermission 与 L“0”进行比较,以便在 strPermission 等于“0”时返回 true。

谢谢!

4

3 回答 3

3

您需要使用 C 运行时库函数。strcmp比较 ANSI 字符串,wcscmp比较 UNICODE 字符串。

你像这样使用它:

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

您无法比较 C 或 C++ 中的 C 样式字符串。查看此C 常见问题解答问题和答案

您要查找的函数称为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实际上取决于编译器选项。我可以通过您的代码告诉您正在使用_UNICODEset 进行编码,这使其成为 a const wchar_t*,但是如果您希望能够使用其他选项进行编译(我想不出这样做的充分理由),您应该使用_tcscmp来比较, 有文字 as_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 回答