C ++ MFC, как сравнить LPCTSTR в операторе if? - PullRequest
2 голосов
/ 21 марта 2012

У меня есть следующий код:

LPCTSTR strPermission = Method();

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

Во время отладки я вижу, что strPermission равен «0», но когда я сравниваю его, как в операторе if, он всегда возвращает false.

Единственное, о чем я могу думать, - это сравнение адреса памяти переменной, а не ее значения.

Как сравнить strPermission с L "0", чтобывернуть true, если strPermission равно "0".

Спасибо!

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Вам нужно будет использовать функцию библиотеки времени выполнения C.strcmp сравнивает строки ANSI, wcscmp сравнивает строки UNICODE.

Вы используете его так:

bool match = wcscmp(strPermission, L"0") == 0;
1 голос
/ 21 марта 2012

Вы не можете сравнивать строки в стиле C, как в C или C ++.Ознакомьтесь с этим C FAQ вопросом и ответом .

Функция, которую вы ищете, называется lstrcmp.

0 голосов
/ 21 марта 2012

LPCTSTR - указатель на массив const wchar_t.strPermission указывает на первый символ массива.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на самом деле зависит от параметров компилятора.По вашему коду я могу сказать, что вы кодируете с установленным _UNICODE, что делает его 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.(Никогда не определяйте их самостоятельно, они относятся к параметрам проекта)

...