C++ MFC, как сравнить LPCTSTR в операторе if?

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

LPCTSTR strPermission = Method();

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

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

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

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

Спасибо!

3 ответа

Решение

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

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

bool match = wcscmp(strPermission, L"0") == 0;

Вы не можете сравнивать строки в стиле C, как в C или C++. Проверьте этот вопрос часто задаваемых вопросов C & ответ.

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

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 макро. (Никогда не определяйте их сами, они относятся к параметрам проекта)

Другие вопросы по тегам