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

0

Какая разница между C и C++ в сравнении строк другими словами?

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

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

Edit2:
Вот рабочий образец.

if(name == "") return;

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

if( name.data() != somes_[i].data() )
....
Теги:
string
comparison
string-comparison

3 ответа

5
Лучший ответ

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

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

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

std::string str1("abc"), str2("def");
if (str1 != str2 && str1 == "abc")
    std::cout << "Yep, I got it.";
  • 0
    Нужно ли явно объявлять хотя бы один элемент std :: string для применения операторов сравнения "==" и "! ="? Что, если один из них будет чем-то вроде «струны»?
  • 0
    @ Тим: да. Одно из сравниваемых значений должно быть экземпляром std::string .
5

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

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

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

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

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 Я не уверен, кто, по вашему мнению, рекомендует это.
Показать ещё 1 комментарий
0

Не используйте! = Или! = Для сравнения строк стиля C (char * или char []).

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

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

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

  • 0
    Это просто перечисляет способы сравнения строк без ответа на вопрос.
  • 0
    Вопрос "Могу ли я использовать! = И == для сравнения строк в стиле C?" Мой ответ: «Нет, (но вы можете использовать этот подход вместо этого.)»
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню