2017-01-10 3 views
-2

как я могу сделать состояние с сопзЬ wchar_t *? Я пробовал const wchar_t* password if (L"xyz" == password) {...} , но это не работаетсделать условие на сопзЬ wchar_t *

спасибо

+4

http://en.cppreference.com/w/cpp/string/wide/wcscmp или использовать 'std :: wstring'. – DeiDei

+0

Сравните содержимое, не содержащее ни одного poniters – doctorlove

+0

Я хочу сравнить содержимое, а не указатели –

ответ

2

Вы должны взглянуть на wcscmp

const wchar_t* password = L"xyz"; 
if (wcscmp(password, L"xyz") == 0) { 
    // Strings are identical 
} 
0

Когда вы делаете L"xyz" == whatever (или даже неширокая версия, "xyz" == whatever), вы сравниваете указатели, а не строковое содержимое.

E.g. скажем, ваша переменная password хранится в памяти 0x00100000, а постоянная L"xyz" хранится в месте 0x00200000. Когда вы выполняете тест равенства с линией L"xyz" == password, то, что он фактически сравнивает, это 0x00100000 == 0x00200000, что, очевидно, никогда не будет правдой.

Что вам нужно сделать, так это использовать библиотечную функцию wcscmp для сравнения строк с широким символом. Однако, поскольку это помечено как C++, вы должны использовать std::wstring и перегруженный operator ==, если у вас нет причин использовать строки C. Это может быть там, где вы запутались: при использовании std::string или std::wstring вы можете использовать== для сравнения строк, потому что эти классы перегрузить оператор == так что этот код работает отлично:

#include <iostream> 
#include <string> 

int main(int argc, char *argv[]) 
{ 
    std::wstring wstr = L"Hello World"; 
    if(wstr == L"Hello World") 
    { 
     std::wcout << wstr << std::endl; 
    } 
    return 0; 
} 

В качестве примечания, вы действительно не следует использовать константы для хранения паролей в вашей программе, если они не зашифрованы каким-то образом.

Смежные вопросы