2013-10-07 1 views
0

В чем отличие C и C++ от сравнения строк другими словами?Могу ли я использовать! = И == в C++ для сравнения строк без написания собственного?

Я приехал из лагеря «С». Я видел программу, использующую == для сравнения строк, я пытался найти свою программу перегрузки, но не нашел ее. Означает ли это, что C++ имеет дело со строкой (char []) с помощью == и! =?
Если у меня есть свой собственный определенный класс String, будет ли он таким же, как я могу использовать == и! = Без их определения? или применяется только к char []?

Редактировать:
Похоже, что я смешанный символ C [] с C++ std :: string class. Хорошо, старый вопрос все еще применяется. Некоторые из них задавали следующие вопросы:
Мои программы определяли переменные char [], но по сравнению с оператором «==». Казалось, это работа. Они являются строкой в ​​стиле C, но работают с «==». Разве компилятор автоматически конвертировал их в std :: string для меня, чтобы программы работали?

Редактировать2:
Вот рабочий образец.

if(name == "") return; 

где "name" - элемент класса MyString. Он имеет конструктор с параметром char *.
MyString имеет публичную функцию data(), она возвращает указатель строки char * C.
Итак, я сравниваю объекты MyString? или строки в стиле C?
Без перегрузки «! =» Я могу сделать что-то вроде ниже?

if(name.data() != somes_[i].data()) 
.... 
+0

Просто для справки: http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp – Mgetz

+1

Он не имеет дело с ним, естественно, если строка реализуется как класс, который он должен реализовать operator == для обработки этого сравнения. Используйте std :: string, для которой это определено для вас. – Alex

+0

Вы уверены, что сравнивали 'char *' или 'char []', а не 'std :: string'? Если это так, мне было бы любопытно увидеть код. – crashmstr

ответ

5

"Означает ли это, C++ дело со строкой (char []), естественно, с == и !=?"

No. Неправильно сравнивать строки C-стиля (т.char[] или char*) между == или != (как на C, так и на C++), потому что вы закончите сравнение указателей, а не строк.

В C++ можно сравнить std::string объект со строкой C-стиле или другой std::string объект из-за std::string «s operator== и operator!=:!

std::string str1("abc"), str2("def"); 
if (str1 != str2 && str1 == "abc") 
    std::cout << "Yep, I got it."; 
+0

Нужно ли явно указывать хотя бы один элемент std :: string для применения операторов сравнения «==» и «! =»? Что, если один из них что-то вроде «строки»? – Tim

+0

@Tim: Да. Одним из сравниваемых значений должен быть экземпляр 'std :: string'. – LihO

5

Означает ли это, C++ дело с струнный (полукокса []), естественно, с == и! =?

Нет; "aaa" == "aaa" преобразует строковые литералы в char* как обычно, и сравнивает значения указателя. Однако большинство реализаций C и C++ будут дедублировать строковые литералы, по крайней мере в объектном файле, так что эти указатели будут одинаковыми. Этот стандарт не гарантируется стандартом, но широко применяется.

Другими словами, C++ не отличается от C в связи с этим и сравнение char* значения таким образом не лучше, чем делать это в С.

ли компилятор автоматически преобразует их в StD :: строка для меня, чтобы программы работали?

std::string имеет перегруженные операторы сравнения, которые работают с char*. Если вы сравните char* с std::string, то один из них будет использован.

char const *s = "aaa"; 
std::string t = "aaa"; 
s == t; // uses overloaded operator== to compare string values. 

http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp

template< class CharT, class traits, class Alloc > 
bool operator==(const CharT* lhs, const basic_string<CharT,Traits,Alloc>& rhs); 
+1

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

+1

@DaleWilson Я не уверен, кто, по вашему мнению, рекомендует его. – bames53

+2

Многие программисты интерпретируют «Это не гарантируется стандартом, но широко применяется». как «Попробуйте, и если это сработает, вы в порядке». Я знаю это, потому что я потратил много своей жизни, исправляя неприятные ошибки, написанные такими программистами. Я отменил свое голосование, потому что вы отвечаете на этот вопрос, но, тем не менее, в любое время, когда вы говорите «это сомнительно, но это работает», было бы очень неплохо добавить «так что, пожалуйста, никогда не используйте его». –

0

Не использовать = или = для сравнения Строки в стиле C (char * или char []).

Если вы уверены, что строки имеют нулевое завершение, используйте std :: strcmp(). Если вы не совсем на 100% ПОЗИТИВНЫ, что они имеют нулевое завершение, используйте std :: strncmp(), чтобы сравнить их.

Если какая-либо из ваших строк является std :: string, вы можете использовать оператор == или operator! =.

[редактировать в ответ на комментарий от barnes53]

+0

Это просто перечисляет способы сравнения строк без ответа на вопрос. – bames53

+0

Вопрос «Могу ли я использовать! = И == сравнить строки [C-style]?» Мой ответ: «Нет, (но вы можете использовать этот подход вместо этого.)« –

+0

Является ли «» (или что-то вроде «word») считаться std :: string? – Tim

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