2016-01-17 6 views
2

Я хочу узнать, почему функция сравнения не дает мне правильный результат?Как сравнить строку C с строкой C++?

Как я знаю, он должен возвращать 0, если две строки одинаковы!

bool validatePassword(char id[], string password) { 

    // cannot be the same as the id string 
    if(password.compare(id) == 0) { 
     cout << "password can not be as same as id\n"; 
     return false; 
    } 

    return true; 
} 
+3

[Невозможно воспроизвести] (http://coliru.stacked-crooked.com/a/94d610d16f537f23). Пожалуйста, предоставьте [mcve], как тот, с которым я связан, или даже с помощью только части сравнения. – chris

+0

Я думаю, вы можете сравнить что-то вроде '' hoge \ n "' с '" hoge "', и причина не давать правильный результат может быть в том, что вход неверен. – MikeCAT

+0

Хорошо работает здесь. –

ответ

0

Вы можете сделать это путем преобразования идентификатора в строку и сравнить со строками:

string idStr(id); 
if (password == idStr){ 

} 

Или используйте STRCMP для сравнения двух полукокса массивов:

if(strcmp (password.c_str(), id) == 0){ 

} 

Вы должны преобразовать string к массиву char с помощью метода c_str()

+2

Построение новой строки просто для того, чтобы сделать сравнение бесполезным, и оба подхода бесполезны, поскольку std :: string уже предоставляет перегрузку 'operator ==' для сравнения строки 'std :: string' с строкой C. –

+0

@MatteoItalia, к счастью, расточительность - это проблема, зависящая от архитектуры. Вы не можете сказать, что построение новой строки, чтобы сравнение было расточительным. У вас есть два значения в двух разных внутренних форматах. Верно то, что вы должны изменить один формат на другой, чтобы иметь возможность сравнивать. Даже если это делается за кулисами, так как автоматическое преобразование 'char *' в 'string' выполняется для использования оператора' == 'или если вы используете' .c_str() 'метод для создания стандартного' char * 'из' string'. Либо вы это сделаете, вы не узнаете, какой метод эффективнее, пока не узнаете целевую арку. –

+0

@MatteoItalia, говоря, что использование родного стандартного C++-типа хуже того, что использование старого типа C говорит слишком мало о языке C++. Вы программируете весь свой код на C++ с использованием старых простых конструкций C по соображениям эффективности. Насколько мне известно, класс «струна» был изобретен и по соображениям эффективности. Не рекомендуется использовать C-конструкции на форуме C++. –

3

Как указано в комментарии другого ответа Matteo Italia. Использование оператора == БППП :: струны, как это:

bool validatePassword(char id[], string password) { 
    return password == id; 
} 

Эта функция действительно нет необходимости, поскольку вызывающий абонент должен позвонить оператору == непосредственно вместо этого.

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