Как сравнить два слова в строке с
К строкам в языке С++ можно применять операции сравнения.
Эти операции сравнивают два объекта string, либо объект string со строковым литералом. Во всех операцияъ операнды сравниваются посимвольно до тех пор, пока не будет найдена пара соответствующих символов, которые содержат разные символы, или пока не будет достигнут конец одного или обоих операндов. Когда пара символов различается, с помощью сравнение числовых кодов символов определяется, какая строка условно «меньше» или «больше». Если разные пары символов не найдены, но строки имеют разную длину, более короткая строка «меньше» более длинной строки. Две строки равны, если они содержат одинаковое количество символы и все соответствующие коды символов равны. Подобный способ сравнения еще называется лексикографическим сравнением или сравнением в лексикографическом порядке. При этом стоит отметить, что поскольку сравниваются числовые коды символов, результат сравнения также зависит от регистра символов.
Например, оператор == возвращает true, если все символы обеих строк равны.
Поскольку строки «hello» и «Hello» отличаются по регистру первой буквы, соответственно отличается и числовой код символа, поэтому эти строки не равны.
Другой пример — операция > (больше):
std::string s1 <"helm">; std::string s2 <"hello">; bool result
В данном случае условие s1 > s2 верно, то есть s1 больше чем s2, так как при равенстве первых трех символов («hel») третий символ первой строки («m») стоит в алфавите после четвертого символа второй строки («l»), то есть «m» больше чем «l» (несмотря на то, что по количеству символов «hello» больше чем «helm»).
Возьмем небольшую программу. Например, у нас есть массив имен, и нам надо отсортировать их в алфавитном порядке:
Здесь для сортировки массива строк применяется не самая быстрая, но наглядная сортировка пузырьком, которая сравнивает предыдущую строку с последующей. Если предыдущая «больше» последующей, то через промежуточную переменную temp обмениваем значения. Чтобы оптимизировать сортировку, добавлена переменная sorted . Каждый раз, когда производится обмен значениями, эта переменная сбрасывается в false. А это значит, что нам надо заново запустить внешний цикл do-while .
Функция compare()
Для сравнения строк у строки также можно вызвать функцию compare() . В нее передается другая строка, с которой сравнивается текущая. Функция compare возвращает 0, если две строки равны. Если текущая строка больше, то возвращается число больше 0. Если текущая строка меньше, то возвращается число менише 0. Например:
Здесь две строки равны, поэтому возвращается число 0.
Здесь строка «Sam» больше строки «Bob», поэтому результатом первого сравнения будет число 1. А во втором сравнении первая строка «Sam» будет меньше второй строки «Tom», соответственно функция возвратить -1.
Функция compare() имеет ряд версий. Отметим одну из них, которая принимает три параметра:
Первый параметр представляет индекс первого символа в текущей строке, начиная с которого начинается подстрока. Второй параметр — количество символов подстроки. Третий параметр — строка, которая сравнивается подстрока. То есть сравниваем строку из третьего параметра с подстрокой, которая начинается с индекса в первом параметре и имеет количество символов, указанных во втором параметре.
Где мы это можем применить? Например, нам надо узнать индекс, с которого встречается одна строка в другой:
В данном случае мы пытаемся найти индекс строки word («world») в строке text («Hello world!»). Для этого в цикле проходим по символам из строки text, пока не дойдем до символа с индексом text.length() — word.length() + 1 (так как сравниваем word.length() символов, поэтому вычитаем word.length(). И так как строки могут быть равны, добавляем 1)
В цикле выполняем сравнение
то есть в строке text сравниваем подстроку, которая начинается с индекса i и имеет word.length() символов с строкой word. Если для какого то числа i мы смогли найти подобное равенство, то выводим число i на консоль. И в данном случае консоль отобразит следующее
Еще одна форма функции compare() позволяет сравнивать две подстроки:
Здесь в принципе тот же алгоритм, что и с предыдущем примере. Только теперь сравниваем из строки word подстроку размером size, которая начинаяется с индекса 1 (то есть подстрока «or»), с подстрокой из строки text. И в данном случае консольный вывод будет следующим
Сравнивание строк в СИ
Во втором способе я отказался от сортировке и таким образом вот мой второй алгоритм:
- Создавал одну копию одного из двух слов
- Далее при помощи двух циклов искал каждый i-й элемент из первой строки по всей второй строке
- Если такой нашелся, то во второй строке этот символ заменяем на ‘*’ (я решил заменять буквы, так как они могут повторяться)
- И после этих циклов проверяю кол-во замен. Если кол-во замен равняется длине строк, то значит все буквы совпали, следовательно, слова состоят из одинаковых букв.
Второй способ мне не кажется таким уж оптимальным. Поэтому я хочу задать вопрос по третьему способу.
Третий способ:
В третьем способе я просто нахожу сумму символов каждого слова и затем эти две суммы сравниваю. Но ведь это точно не может значить, что буквы в словах совпадают, верно? Мне нужна помощь, как мне полностью доделать третий способ, чтобы он точно определял, совпадают ли буквы в словах.
C # Как я могу сравнить две строки слов и указать, какие части отличаются
Однако это не обязательно один символ. Я тоже могу быть таким.
В этом случае я хотел бы получить.
Другим примером может быть. (Обратите внимание, что длина обоих слов различна).
Другим примером может быть.
Как мне это сделать?
Изменение: длина двух строк может быть разной.
Изменение: добавлены дополнительные примеры. Кредит предоставляется пользователю Nenad для запроса.
5 ответов
Мне сегодня должно быть очень скучно, но я действительно сделал UnitTest, который передает все 4 случая (если вы еще не добавили еще кое-что).
Edit: Добавлено 2 крайних случая и исправить для них.
Edit2: буквы, повторяющиеся несколько раз (и ошибка на этих письмах)
Вы пробовали мой DiffLib?
С этой библиотекой и следующим кодом (работает в LINQPad):
Вы получаете этот результат:
Честно говоря, я не понимаю, что это дает вам, как вы, кажется, полностью игнорировать измененные части в b строке, только демпинг соответствующих частей a строке.
Не очень хороший подход, но как упражнение в использовании LINQ: задача, похоже, найти подходящий префикс и суффикс для двух строк, вернуть «префикс + [+ посередине первой строки + суффикс.
Таким образом, вы можете сопоставить префикс (Zip + TakeWhile (a == b)), чем повторить то же самое для суффикса, изменив обе строки и реверсивный результат.
Намного проще и быстрее использовать 2 for циклов (от начала до конца и от начала до конца).
Урок 21. Функции сравнения строк C#
21-я часть учебника по основам языка C# продолжает изучение функциональности управления строками, предоставляемой классом String. В данной статье рассматриваются методы, доступные для сравнения содержимого строк.
Операторы равенства и неравенства
В более ранней части учебника по основам C# мы обсуждали равенство ( == ) и неравенство (!=) — реляционные операторы. Эти операторы позволяют производить точное сравнение двух строк с учетом регистра. В случае оператора равенства, если строки совпадают, результирующее логическое значение равно true. Если они отличаются, результат будет false. Оператор неравенства возвращает противоположный результат, как показано ниже:
Эти операторы полезны, но имеют ограничения. Они не позволяют вам рассматривать равенство двух строк, которые совпадают во всех, кроме регистра символов, к примеру. Они также не позволяют определить, что одна строка больше другой. В этой статье описываются методы, которые предоставляются для решения данных проблем.
Относительное сравнение
Метод CompareTo
Платформа .NET framework предоставляет метод CompareTo для многих типов данных, включая строки. Он позволяет сравнивать два значения и возвращает результат, который указывает не только на то, равны ли они, но и на то, что больше, когда они не равны. Метод учитывает и другую информацию при сравнении строк. Например, японские символы катаканы могут быть написаны двумя способами: в половину ширины или в полную ширину. Метод CompareTo считает, что символы, записанные как полная ширина, равны тем же символам половины ширины. Та же культурная информация используется для определения того, какая строка больше.
Метод CompareTo работает с существующей строкой. Строка, с которой она будет сравниваться, передается параметру. Метод возвращает целое число, обозначающее результат сравнения следующим образом:
Это можно уточнить на примере:
Примечание: поскольку этот метод вызывается для существующего экземпляра string, то если строка имеет значение null, возникает исключение:
Метод Compare
Функция Compare является статическим методом класса string. Он предоставляет аналогичную функциональность CompareTo, но позволяет указать больше опций. В качестве статического члена класса string обе строки передаются в качестве параметров.
Сравнение значений Null
Метод CompareTo вызывает исключение, если проверяемая строка имеет значение null, так как объект null не имеет доступных методов. Однако, поскольку метод Compare статичен, можно сравнивать пустые строки. Чувствительность к регистру
Метод Compare позволяет вам решать, выполнять ли сравнения с учетом регистра или без учета регистра. Различия между прописными и строчными буквами применяются в соответствии с настройками языка пользователя. Чтобы определить, следует ли использовать сравнение с учетом регистра, используется третий логический параметр. Если значение true, регистры игнорируются. Если false, то эффект будет таким же, как и отсутствие параметра вообще.
Этот пример предполагает английские настройки:
Метод Compare включает в себя перегруженные версии, позволяющие сравнивать строки с использованием дополнительных настроек международного языка, а также опции сравнения частей строк. Они выходят за рамки этого учебника, но их стоит изучить. Дополнительные сведения можно найти в MSDN.
Метод CompareOrdinal
Статический метод Compareordinal позволяет производить сравнение двух строк с учетом регистра. Он отличается от Compare тем, что result сравнения основан на числовых значениях Юникода для каждого символа. Поскольку важность символов в культурном контексте может отличаться от фиксированного числового порядка Юникода, при сравнении с использованием этого метода могут быть получены различные результаты. Это показано в следующем примере, который предполагает английскую конфигурацию Великобритании:
Метод Equals
Ну и рассмотрим метод Equals для полноты урока. Он возвращает логический result, указывающий, совпадают ли две строки, подобно оператору равенства (==). Метод может использоваться для объекта string с одним параметром или в качестве статического члена с двумя параметрами для сравниваемых строк.
Метод IsNullOrEmpty .NET 2.0
Иногда необходимо проверить, является ли строка пустой или неопределенной (null). При использовании .NET 1.1 для этого потребуется два теста. В .NET framework 2.0 появился новый статический метод isnullorempty, который выполняет оба теста с помощью одной инструкции. Метод возвращает true, если строка пустая или null.
Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
статьи IT, Уроки по си шарп, си шарп, string, сравнение