Сравнение строк.
Библиотека <cstring> предлагает пользователю готовые функции, выполняющие сравнение строк. Далее будут рассмотрены функции, выполняющие посимвольное сравнение двух строк и возвращающие разность кодов первых несовпадающих символов.
Функция strcmp.
Функция strcmp имеет прототип:
int strcmp(const char* str1, const char* str2);
- 0 , если str1 > str2
Эта функция производит сравнение, различая прописные и строчные буквы
char s1[]="Hello"; char s2[]="HeLlo"; int k=strcmp(s1,s2); coutВ результате, на экран будет выведено: 32. Т.к. код символа l = 108, а код символа L = 76. 108-76=32.
Функция stricmp.
Функция stricmp имеет тот же прототип как и функция strcmp. Отличие этих двух функций лишь в том, что stricmp не различает регистр символов. Т.е. для предыдущего примера на экран выведется 0.
Функция strncmp.
Имеет прототип:int strncmp(const char* str1, const char* str2, size_t num);Эта функция сравнивает num первых символов строк, на которые указывают указатели str1 и str2. Пример:
char s1[]="Hello"; char s2[]="HeLlo"; int k=strncmp(s1,s2,2); coutКак сравнивать двух строк типа string?
Для class basic_string определён метод compare().
Ответ написан более трёх лет назад Комментировать Нравится Комментировать goldstar2154 @goldstar2154
А через него переопределены friend операторы ==, |=, >, =
Все операции могут применяться и к string и к const char* как одному из операндов.
Смысл сравнений - естественный лексографический порядок, который вы поменять (легко) не можете.Как правило для всех классов, реализующих работу со строками (CString, std::string, QString), уже доступны перегруженные операторы сравнения <, >, == и т.д. Так же могут существовать методы сравнения с условиями, вроде CompareNoCase.
Ответ написан более трёх лет назад Комментировать Нравится Комментировать Ваш ответ на вопрос
Если вы реализуете алгоритм быстрой сортировки и хотите реализовать собственные методы сравнения строк, то самым простым вариантом будет пронаследоваться от класса строк и переопределять методы сравнения.
Если вы работаете с char* то посмотрите реализацию memmcmp и strcmp
www.cplusplus.com/reference/cstring/memcmp
www.cplusplus.com/reference/cstring/strcmp
P.S. совет, не изобретайте велосипед, т.к. алгоритмы сортировки оттачивались математиками и программистами много лет. Выигрыш по быстродействию вы сможете ощутить только, если у вас очень специфичные наборы строк.
Например у всех строк первые три символа одинаковы, тогда кастомная сортировка с 4-го символа может дать выигрыш по времени.,>Войдите, чтобы написать ответ
- C++
Не могу, понять как компьютер перемещает свой знак?
- 1 подписчик
- 14 часов назад
- 65 просмотров
Как сравнить две строки в c
К строкам в языке С++ можно применять операции сравнения.
Эти операции сравнивают два объекта string, либо объект string со строковым литералом. Во всех операцияъ операнды сравниваются посимвольно до тех пор, пока не будет найдена пара соответствующих символов, которые содержат разные символы, или пока не будет достигнут конец одного или обоих операндов. Когда пара символов различается, с помощью сравнение числовых кодов символов определяется, какая строка условно "меньше" или "больше". Если разные пары символов не найдены, но строки имеют разную длину, более короткая строка «меньше» более длинной строки. Две строки равны, если они содержат одинаковое количество символы и все соответствующие коды символов равны. Подобный способ сравнения еще называется лексикографическим сравнением или сравнением в лексикографическом порядке. При этом стоит отметить, что поскольку сравниваются числовые коды символов, результат сравнения также зависит от регистра символов.
Например, оператор == возвращает true, если все символы обеих строк равны.
std::string s1 ; bool result ; // false - строки различаются по регистру result = s1 == "hello"; // true
Поскольку строки "hello" и "Hello" отличаются по регистру первой буквы, соответственно отличается и числовой код символа, поэтому эти строки не равны.
Другой пример - операция > (больше):
std::string s1 ; std::string s2 ; bool result s2>; // true
В данном случае условие s1 > s2 верно, то есть s1 больше чем s2, так как при равенстве первых трех символов ("hel") третий символ первой строки ("m") стоит в алфавите после четвертого символа второй строки ("l"), то есть "m" больше чем "l" (несмотря на то, что по количеству символов "hello" больше чем "helm").
Возьмем небольшую программу. Например, у нас есть массив имен, и нам надо отсортировать их в алфавитном порядке:
#include #include int main() < std::string people[] ; // сортируем по возрастанию bool sorted <>; do < sorted = true; // остается true, если строки отсортированы std::string temp; // переменная для обмена значениями for (unsigned i ; i < std::size(people); i++) < // если предыдущая строка больше последующей if (people[i-1] >people[i]) < // обмениваем значения temp = people[i]; people[i] = people[i-1]; people[i-1] = temp; sorted = false; >> > while (!sorted); // вывод строк на консоль for (const auto person: people) < std::cout >
Здесь для сортировки массива строк применяется не самая быстрая, но наглядная сортировка пузырьком, которая сравнивает предыдущую строку с последующей. Если предыдущая "больше" последующей, то через промежуточную переменную temp обмениваем значения. Чтобы оптимизировать сортировку, добавлена переменная sorted . Каждый раз, когда производится обмен значениями, эта переменная сбрасывается в false. А это значит, что нам надо заново запустить внешний цикл do-while .
Alice Bob Kate Sam Tom
Функция compare()
Для сравнения строк у строки также можно вызвать функцию compare() . В нее передается другая строка, с которой сравнивается текущая. Функция compare возвращает 0, если две строки равны. Если текущая строка больше, то возвращается число больше 0. Если текущая строка меньше, то возвращается число менише 0. Например:
std::string tom ; std::string person; int result = tom.compare(person); std::coutЗдесь две строки равны, поэтому возвращается число 0.
std::string tom ; std::string bob; std::string sam ; int result = sam.compare(bob); // 1 - первая строка (sam) больше второй (bob) std::coutЗдесь строка "Sam" больше строки "Bob", поэтому результатом первого сравнения будет число 1. А во втором сравнении первая строка "Sam" будет меньше второй строки "Tom", соответственно функция возвратить -1.
Функция compare() имеет ряд версий. Отметим одну из них, которая принимает три параметра:
int compare(size_t _Off, size_t _Nx, const std::string &_Right) constПервый параметр представляет индекс первого символа в текущей строке, начиная с которого начинается подстрока. Второй параметр - количество символов подстроки. Третий параметр - строка, которая сравнивается подстрока. То есть сравниваем строку из третьего параметра с подстрокой, которая начинается с индекса в первом параметре и имеет количество символов, указанных во втором параметре.
Где мы это можем применить? Например, нам надо узнать индекс, с которого встречается одна строка в другой:
#include #include int main() < std::string text ; std::string word ; for (unsigned i<>; i < text.length() - word.length() + 1; i++) < if (text.compare(i, word.length(), word) == 0) < std::cout > >В данном случае мы пытаемся найти индекс строки word ("world") в строке text ("Hello world!"). Для этого в цикле проходим по символам из строки text, пока не дойдем до символа с индексом text.length() - word.length() + 1 (так как сравниваем word.length() символов, поэтому вычитаем word.length(). И так как строки могут быть равны, добавляем 1)
В цикле выполняем сравнение
if (text.compare(i, word.length(), word) == 0)то есть в строке text сравниваем подстроку, которая начинается с индекса i и имеет word.length() символов с строкой word. Если для какого то числа i мы смогли найти подобное равенство, то выводим число i на консоль. И в данном случае консоль отобразит следующее
text contains world at index 6Еще одна форма функции compare() позволяет сравнивать две подстроки:
#include #include int main() < std::string text ; std::string word ; unsigned size ; // число сравниваемых символов из второй строки for (unsigned i<>; i < text.length() - size + 1; i++) < if (text.compare(i, size, word, 1, size) == 0) < std::cout > >Здесь в принципе тот же алгоритм, что и с предыдущем примере. Только теперь сравниваем из строки word подстроку размером size, которая начинаяется с индекса 1 (то есть подстрока "or"), с подстрокой из строки text. И в данном случае консольный вывод будет следующим
text contains substring at index 7Сравнение строк в C++: три основных метода
В этом руководстве мы изучим методы сравнения строк в C++. Давайте предположим, что нам необходимо ввести свое имя и пароль для входа на определенный веб-сайт. Для подобных случаев на серверной части мы должны собрать и написать скрипт для проверки и сравнения входной строки со строкой, хранящейся в базе данных.
Итак, на таком простом примере мы рассмотрим несколько способов сравнения строк в языке C++.
Методы сравнения строк в C++
Строки в C++ можно сравнивать с помощью любого из следующих методов:
- Строковая функция strcmp()
- Встроенная функция compare()
- Реляционные операторы С++ ( ‘==’, ‘!=’)
1: Строковая функция strcmp()
C++ имеет встроенные функции для управления и обработки данных строкового типа. Чтобы сравнить две строки, мы можем использовать функцию strcmp().
strcmp() — это библиотечная функция C, используемая для сравнения двух строк лексикографическим способом.
Синтаксис функции выглядит так:
int strcmp ( const char * str1, const char * str2 );
Функция возвращает 0, если строки одинаковы.
Входная строка должна быть массивом символов в стиле C.
При сравнении строк функция strcmp() учитывает регистр.
#include using namespace std; #include int main()
В результате вы получите:
String 1:JournalDEV String 2:JournalDEv The input strings are not equal.
#include using namespace std; #include int main()
Результат будет выглядеть так:
String 1:Python String 2:Python Both the input strings are equal.
2: Функция compare()
C++ имеет встроенную функцию compare(), которая нужна для быстрого сравнения двух строк.
Функция сравнивает две строки и возвращает следующие значения в зависимости от результата сравнения:
int compare (const string& string-name) const;
А теперь давайте рассмотрим пару примеров. Пример 1:
#include using namespace std; int main()
В приведенном выше примере мы сравнили строку 1 со строкой 2. Как видите, обе строки лексикографически одинаковы, потому функция возвращает 0.
String 1:Python String 2:Python Both the input strings are equal.
#include using namespace std; int main()
В приведенном выше фрагменте кода мы снова сравнили строку с другой входной строкой с помощью функции compare().
String 1:Python Strings are equal. String 2:JournalDEV Strings are not Equal.
3: Реляционные операторы в C++
Реляционные операторы C++, такие как «==» и «!=», можно легко использовать для сравнения строк.
Синтаксис их выглядит следующим образом:
string1 == string 2 или string1 != string2
Давайте взглянем на первый пример с использованием оператора ==:
#include using namespace std; int main() < string str_inp1; string str_inp2; cout>str_inp1; cout>str_inp2; if (str_inp1 == str_inp2) cout
Он вернет такой результат:
Enter the String 1: Python Enter the String 2: PythoN Strings are not equal
Во втором примере мы попробуем использовать оператор !=:
#include using namespace std; int main() < string str_inp1; string str_inp2; cout>str_inp1; cout>str_inp2; if (str_inp1 != str_inp2) cout
В этом случае будет следующий результат:
Enter the String 1: Python Enter the String 2: Python Strings are equal
Заключение
В этой статье мы рассмотрели различные способы сравнения строк в языке C++.
Больше информации о C++ вы найдете в официальной документации.

