Какая функция корректно сравнивает две подстроки
Перейти к содержимому

Какая функция корректно сравнивает две подстроки

  • автор:

Как в C# правильно сравнивать строки

В обоих случаях результат True , хотя String является классом и оператор == должен был сравнить ссылки. IlDasm показал, что создаются 2 переменные и сравниваются согласно методам Equals и == (op_Equality)

 IL_0000: nop IL_0001: ldstr "s" IL_0006: stloc.0 IL_0007: ldstr "s" IL_000c: stloc.1 IL_000d: ldstr "eq: " IL_0012: ldloc.0 IL_0013: ldloc.1 IL_0014: callvirt instance bool [mscorlib]System.String::Equals(string) IL_0019: box [mscorlib]System.Boolean IL_001e: call string [mscorlib]System.String::Concat(object, object) IL_0023: call void [mscorlib]System.Console::WriteLine(string) IL_0028: nop IL_0029: ldstr "==: " IL_002e: ldloc.0 IL_002f: ldloc.1 IL_0030: call bool [mscorlib]System.String::op_Equality(string, string) IL_0035: box [mscorlib]System.Boolean IL_003a: call string [mscorlib]System.String::Concat(object, object) 

Отслеживать
задан 31 янв 2017 в 20:56
Vadim Prokopchuk Vadim Prokopchuk
2,732 2 2 золотых знака 17 17 серебряных знаков 42 42 бронзовых знака

Оператор == сравнивает лишь ссылки (и тем самым j,sxyj бесполезен) лишь в Java. В C#, в отличие от Java, есть перегрузка операторов.

31 янв 2017 в 21:41

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

В C# правильно сравнивать строки и через == , и через Equals . Но более предпочтительным будет сравнивать через == .

Почему так?

Метод Equals подразумевает сравнение значений объектов ссылочного типа, он объявлен как virtual и для строк он перегружен и сравнивает их, как и предполагается, по значению. В Ваших классах Вы должны давать свою реализацию для него. Иначе он будет вести себя как ReferenceEquals и для ссылок, которые указывают не на один объект будет давать false , хоть они и будут равны по значению.

Оператор == для строк представляют свою реализацию, отличную от стандартной для всех других объектов ссылочного типа. Если сравниваемые ссылки имеют тип System.String , то он сначала сравнит указывают ли ссылки на один тот же объект и если нет, то будет сравнивать две ссылки типа System.String по значению.

Но маленькое замечание, если мы сравниваем объект типа System.String ( string ) с объектом типа System.Object (object), который указывает на строку, они будут сравниваться по значениям.

string str = "str"; object obj = "str"; bool result = str.Equals(obj); 

result будет равен true , так как obj приведётся к типу string , потому что метод Equals мы вызвали у строки (объекта типа string ).

Но если мы сравниваем объект типа System.Object (object), который указывает на строку, с объектом типа System.String ( string ) они будут сравниваться по ссылке.

string str = "str"; object obj = "str"; bool result = obj.Equals(str); 

result будет равен false , так как str приведётся к типу object , потому что метод Equals мы вызвали у объекта типа object .

Поэтому в данном случае важно привести object к типу string

Сравнение строк в .NET

Платформа .NET обеспечивает несколько методов для сравнения значений строк. В таблице ниже перечислены и описаны методы сравнения значений.

Имя метода Использование
String.Compare Сравнивает значения двух строк. Возвращает целочисленное значение.
String.CompareOrdinal Сравнивает две строки без учета локального языка и региональных параметров. Возвращает целочисленное значение.
String.CompareTo Сравнивает текущий строковый объект с другой строкой. Возвращает целочисленное значение.
String.StartsWith Определяет, начинается ли строка с переданной строки. Возвращает логическое значение.
String.EndsWith Определяет, заканчивается ли строка переданной строкой. Возвращает логическое значение.
String.Contains Определяет, встречается ли символ или строка в другой строке. Возвращает логическое значение.
String.Equals Определяет, совпадают ли две строки. Возвращает логическое значение.
String.IndexOf Возвращает индекс позиции символа или строки начиная с начала проверяемой строки. Возвращает целочисленное значение.
String.LastIndexOf Возвращает индекс позиции символа или строки начиная с конца проверяемой строки. Возвращает целочисленное значение.

Compare Метод

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

Возвращаемое значение Condition
Отрицательное целое число Первая строка предшествует второй в порядке сортировки.

Метод String.Compare в основном предназначен для использования при упорядочивании или сортировке строк. Не следует использовать метод String.Compare для проверки на равенство (то есть для явного поиска возвращаемого значения 0 без учета того, является ли одна строка меньше или больше другой). Для определения равенства двух строк используйте метод String.Equals(String, String, StringComparison) .

В примере ниже метод String.Compare используется для определения относительных значений двух строк.

String^ string1 = "Hello World!"; Console::WriteLine(String::Compare(string1, "Hello World?")); 
string string1 = "Hello World!"; Console.WriteLine(String.Compare(string1, "Hello World?")); 
Dim string1 As String = "Hello World!" Console.WriteLine(String.Compare(string1, "Hello World?")) 

Этот пример выводит на консоль значение -1 .

В предыдущем примере по умолчанию учитывается язык и региональные параметры. Для сравнения строк без учета языка и региональных параметров используйте перегрузку метода String.Compare, которая позволяет указать язык и региональные параметры с помощью параметра culture. См. пример, демонстрирующий использование метода String.Compare для сравнения строк без учета языка и региональных параметров.

CompareOrdinal Метод

Метод String.CompareOrdinal сравнивает два строковых объекта без учета локального языка и региональных параметров. Возвращаемые этим методом значения идентичны значениям, возвращаемым методом Compare в предыдущей таблице.

Метод String.CompareOrdinal в основном предназначен для использования при упорядочивании или сортировке строк. Не следует использовать метод String.CompareOrdinal для проверки на равенство (то есть для явного поиска возвращаемого значения 0 без учета того, является ли одна строка меньше или больше другой). Для определения равенства двух строк используйте метод String.Equals(String, String, StringComparison) .

В примере ниже метод CompareOrdinal используется для сравнения значений двух строк.

String^ string1 = "Hello World!"; Console::WriteLine(String::CompareOrdinal(string1, "hello world!")); 
string string1 = "Hello World!"; Console.WriteLine(String.CompareOrdinal(string1, "hello world!")); 
Dim string1 As String = "Hello World!" Console.WriteLine(String.CompareOrdinal(string1, "hello world!")) 

Этот пример выводит на консоль значение -32 .

CompareTo Метод

Метод String.CompareTo сравнивает строку, которую инкапсулирует текущий строковый объект, с другой строкой или объектом. Возвращаемые этим методом значения идентичны значениям, возвращаемым методом String.Compare в предыдущей таблице.

Метод String.CompareTo в основном предназначен для использования при упорядочивании или сортировке строк. Не следует использовать метод String.CompareTo для проверки на равенство (то есть для явного поиска возвращаемого значения 0 без учета того, является ли одна строка меньше или больше другой). Для определения равенства двух строк используйте метод String.Equals(String, String, StringComparison) .

В примере ниже метод String.CompareTo используется для сравнения объекта string1 с объектом string2 .

String^ string1 = "Hello World"; String^ string2 = "Hello World!"; int MyInt = string1->CompareTo(string2); Console::WriteLine( MyInt ); 
string string1 = "Hello World"; string string2 = "Hello World!"; int MyInt = string1.CompareTo(string2); Console.WriteLine( MyInt ); 
Dim string1 As String = "Hello World" Dim string2 As String = "Hello World!" Dim MyInt As Integer = string1.CompareTo(string2) Console.WriteLine(MyInt) 

Этот пример выводит на консоль значение -1 .

Все перегрузки метода String.CompareTo по умолчанию выполняют сравнение с учетом языка и региональных параметров и регистра. У этого метода нет перегрузок, позволяющих выполнять сравнение без учета языка и региональных параметров. Для ясности кода рекомендуется использовать String.Compare метод вместо этого, указывая CultureInfo.CurrentCulture для операций с учетом языка и региональных параметров или CultureInfo.InvariantCulture для нечувствительных операций с языком и региональных параметров. Примеры, демонстрирующие использование String.Compare метода для выполнения сравнения нечувствительных строк с учетом языка и региональных параметров, см. в разделе «Выполнение нечувствительных строк и региональных параметров».

Equals Метод

Метод String.Equals может легко определить, совпадают ли две строки. Этот метод учитывает регистр и возвращает логическое значение true или false . Метод можно вызывать из существующего класса, как показано в следующем примере. В примере ниже метод Equals используется для определения того, содержит ли строковый объект фразу «Hello World».

String^ string1 = "Hello World"; Console::WriteLine(string1->Equals("Hello World")); 
string string1 = "Hello World"; Console.WriteLine(string1.Equals("Hello World")); 
Dim string1 As String = "Hello World" Console.WriteLine(string1.Equals("Hello World")) 

Этот пример выводит на консоль значение True .

Этот метод также можно использовать как статический. В примере ниже два строковых объекта сравниваются с помощью статического метода.

String^ string1 = "Hello World"; String^ string2 = "Hello World"; Console::WriteLine(String::Equals(string1, string2)); 
string string1 = "Hello World"; string string2 = "Hello World"; Console.WriteLine(String.Equals(string1, string2)); 
Dim string1 As String = "Hello World" Dim string2 As String = "Hello World" Console.WriteLine(String.Equals(string1, string2)) 

Этот пример выводит на консоль значение True .

Методы StartsWith и EndsWith

Метод можно использовать String.StartsWith для определения того, начинается ли строковый объект с теми же символами, которые охватывают другую строку. Этот метод учитывает регистр и возвращает значение true , если текущий строковый объект начинается с переданной строки, и значение false в противном случае. В примере ниже этот метод используется для определения того, начинается ли строковый объект со слова «Hello».

String^ string1 = "Hello World"; Console::WriteLine(string1->StartsWith("Hello")); 
string string1 = "Hello World"; Console.WriteLine(string1.StartsWith("Hello")); 
Dim string1 As String = "Hello World!" Console.WriteLine(string1.StartsWith("Hello")) 

Этот пример выводит на консоль значение True .

Метод String.EndsWith сравнивает переданную строку с символами, существующими в конце текущего объекта строки. Он также возвращает логическое значение. В примере ниже конец строки проверяется с помощью метода EndsWith .

String^ string1 = "Hello World"; Console::WriteLine(string1->EndsWith("Hello")); 
string string1 = "Hello World"; Console.WriteLine(string1.EndsWith("Hello")); 
Dim string1 As String = "Hello World!" Console.WriteLine(string1.EndsWith("Hello")) 

Этот пример выводит на консоль значение False .

Методы IndexOf и LastIndexOf

Метод можно использовать String.IndexOf для определения положения первого вхождения определенного символа в строке. Этот метод учитывает регистр и начинает отсчет с начала строки. Он возвращает позицию переданного символа, используя отсчитываемый от нуля индекс. Если символ не удается найти, возвращается значение –1.

В примере ниже метод IndexOf используется для поиска первого вхождения символа » l » в строку.

String^ string1 = "Hello World"; Console::WriteLine(string1->IndexOf('l')); 
string string1 = "Hello World"; Console.WriteLine(string1.IndexOf('l')); 
Dim string1 As String = "Hello World!" Console.WriteLine(string1.IndexOf("l")) 

Этот пример выводит на консоль значение 2 .

Метод String.LastIndexOf аналогичен методу String.IndexOf за исключением того, что он возвращает позицию последнего вхождения конкретного символа в строку. Он учитывает регистр и использует отсчитываемый от нуля индекс.

В примере ниже метод LastIndexOf используется для поиска последнего вхождения символа » l » в строку.

String^ string1 = "Hello World"; Console::WriteLine(string1->LastIndexOf('l')); 
string string1 = "Hello World"; Console.WriteLine(string1.LastIndexOf('l')); 
Dim string1 As String = "Hello World!" Console.WriteLine(string1.LastIndexOf("l")) 

Этот пример выводит на консоль значение 9 .

Оба метода полезны при использовании в сочетании с методом String.Remove . Вы можете использовать методы IndexOf или LastIndexOf методы для получения позиции символа, а затем предоставить эту позицию Remove методу, чтобы удалить символ или слово, начинающееся с этого символа.

См. также

  • Рекомендации по использованию строк в .NET
  • Базовые операции со строками
  • Выполнение нечувствительных строковых операций с языком и региональных параметров
  • Сортировка таблиц веса, используемая платформа .NET Framework и .NET Core 1.0-3.1 в Windows
  • Таблица элементов сортировки Юникода по умолчанию используется .NET 5 на всех платформах и .NET Core в Linux и macOS

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Какая функция корректно сравнивает две подстроки

Операции над строками.

Свойства строки в PHP :

  • Строка может содержать любые символы.
  • Строка может содержать произвольное количество символов. Длина строки ограничивается только объемом оперативной памяти, что позволяет читать в строку целые файлы и работать с ними, как с обыкновенными строками, например сравнивать.

Для конкатенации (присоединения строк) используется оператор «.» (точка). Пример конкатенации строк:

$c = $a.$b; // число + число

echo «$c\n»; // выведет 2010

$c = $a.$d; // число + строка

echo «$c\n»; // выведет 20 Hello

В PHP операнды сравниваются как строки, только в том случае, если они — строки. В противном случае они сравниваются, как числа. При этом любая строка, которую интерпретатору не удается перевести в число, будет восприниматься, как 0.

Лучше всего для сравнения использовать = = = (тройной оператор равенства — оператор эквивалентности). Он всегда позволяет производить корректное сравнение, т.к. он сравнивает величины и по значению, и по типу.

Функция strlen() возвращает длину строки, то есть количество символов, которое содержит строка.

echo strlen ($a); // выведет5

Функция strpos() ищет подстроку в строке. Функции нужно передать три параметра:

  • строку, в которой ищем подстроку.
  • подстроку.
  • позицию, начиная с которой происходит поиск. Данный параметр необязательный и по умолчанию равен 0.

Если строка не найдена, функция возвращает false, в противном случае — номер позиции, с которой начинается вхождение подстроки в строку:

echo strpos(«Hello», «el»); // выведет 1

Функция substr (string $str, int $from, int $lenght) возвращает заданный участок строки, то есть подстроку. Возвращается подстрока строки $str, начиная с позиции $from длины $length. Если параметр $from будет отрицательным, то отсчет подстроки будет производиться с конца строки, а не с начала. Параметр $length является необязательным.

echo substr ($str, 1, 1); // выведет o

echo substr ($str, -1, 1); // выведет k

Функция strcmp ($str1, $str2) сравнивает две строки и возвращает следующие значения:

0, если строки равны;

1, если строка $str1 лексикографически больше $str2 ;

-1, если строка $str 1 «меньше» $str2.

Функция strasecmp (sstring $str1, string $str2) сравнивает две строки без учета регистра символов, то есть, строки BOOK, BOOK и book для этой функции равны.

Функция str_replace ($str1, $str2, $source) заменяет в строке $source (которая в процессе работы функции не изменяется) все вхождения подстроки $str1 на подстроку $str2 и возвращает результат в виде новой строки.

Пример замены символов новой строки \n на тэг
:

$str = str_replace («\n», «
«, $str);

Функция WordWrap() оказывается очень полезной, когда нужно отформатировать текст письма перед его отправкой. Данная функция разбивает текст письма на строки, завершая каждую символом разрыва строки(по умолчанию \n ). В каждой строке должно быть не более 75 символов (но можно указать и другое их количество). Например:

$s = » Очень длинный блок текста, который нужно разбить на части перед отправкой адресату «;

// разбиваем по 15 символов

$s = WordWrap ($s, 15, «\n»);

Функция strip_tags() . Данная функция удаляет из строки все HTML — тэги:

Список тэгов, которые не стоит удалять, можно указать их при вызове функции:

Обратиться к любому символу строки можно по его индексу:

echo $str[0]; // выведет В

Функция chr (int $code) возвращает строку, состоящую из символа с кодом $code , а функция ord ($char) — код символа $char:

echo chr (75); // выведет K

echo ord (‘A’); // выведет 65 — код буквы A

Для перевода символов в нижний регистр используется функция strtolower(), а в верхний — strtoupper():

$str = strtolower ($str);

$str = strtoupper ($str);

При изменении регистра русских букв могут возникнуть проблемы, избежать которых поможет правильная настройка локали. Локалью называется совокупность настроек системы, таких как формат даты и времени, язык, кодировка. Для установки локали используется функция SetLocale() , которой следует передать два параметра — категорию устанавливаемых параметров и локаль. Категория может быть следующей:

  • LC_TYPE — используется для установки локали перевода символов нижний/верхний регистры.
  • LC_NUMERIC — используется для установки локали для функции форматирования дробных чисел.
  • LC_TIME — помогает настроить форматированный вывод даты и времени.
  • LC_ALL — устанавливает все вышеперечисленные режимы.

Любая локаль, установленная в системе, имеет свое уникальное имя, по которому можно к ней обратиться. Категория LC_TYPE устанавливает локаль для преобразования символов. Имя активизированной локали для катагории LC_TYPE содержится в элементе с ключом LAND массива GLOBALS (эта переменная окружения LAND ). В некоторых случаях — это ru_RU.koi8 . Для корректного преобразования символов нужно выполнить функцию:

SetLocal (‘LC_TYPE’, ‘ru_RU.koi8’);

После приема параметров (например при заполнении формы), прежде чем приступить к их обработке, нужно преобразовать значения параметров (удалить лишние пробелы). Пробельными символами являются символы » «, \n, \r, \t.

Функция trim() удаляет пробельные символы в начале и в конце строки, например:

$s = trim ($s); // $s = «string»

Кроме функции trim() можно использовать функции ltrim() и chop(). Первая удаляет пробельные символы только в начале строки, вторая — только в конце.

Функция UrlEncode() используется для кодирования данных. Кодирование необходимо для передачи данных через Интернет, содержащих специальные символы национальных алфавитов, например русского языка. При передаче целого файла его необходимо закодировать с помощью функции UrlEncode() .

Пример автоматического формирования ссылки < a href>:

$Param = » Русский текст «;

В следующем листинге приведен пример, демонстрирующий совместную работу функций UrlEncode() и UrlDecode():

$Param = » Русский текст «;

$Param = UrlEncode ($Param);

$Param = UrlDecode ($Param);

Для вывода кавычек и наклонной черты необходимо использовать цитирование, то есть, запись этих символов через наклонную черту:

Для добавления слэшей используется функция AddSlashes (string $str), а для удаления — StripSlashes (atring $str).

Обе функции возвращают модифицированную строку и не изменяют исходную.

Функция HtmlSpecialChars (string $str) заменяет специальные символы (кавычки, «больше», «меньше» и другие) на их HTML — эквиваленты, для того, чтобы на Web — странице они выглядели сами собой. Например при использовании функции HtmlSpecialChars , знак «больше» в коде будет заменен строкой &gt, а кавычки — &quot. Пример использования функции HtmlSpecialChars:

$s = HtmlSpecialChars ($s);

В PHP применяется функция convert_cyr_string(), преобразующая русский текст из одной кодировки в другую. Данной функции необходимо передать три параметра:

  • Исходную строку.
  • Исходную кодировку.
  • Требуемую кодировку.

Последние два параметра могут принимать следующие значения:

w -windows-1251;

d или a — x-cp866;

m — x-mac-cyrillic;

i — iso8859-5.

Пример использования функции convert_cyr_string():

// Преобразование слова «Привет» из кодировки koi8-r в windows-1251

echo convert_cyr_string (» Привет «, «k», «w»); // выведет «оПХБЕР»

Функция md5() кодирует строку, используя алгоритм MD5 (Message Digest Algorithm). Вероятность того, что две разные строки будут иметь одинаковый хэш — код, стремится к нулю, а это позволяет эффективно использовать данную функцию для шифрования паролей. Зашифрованное с его помощью сообщение невозможно расшифровать — для алгоритма MD5 не существует алгоритма дешифровки. Для проверки подлинности пароля нужно зашифровать пароль заново и сравнить зашифрованные строки: если они равны, значит пароль правильный. Например:

if (md5 ($a) === md5 ($b)) echo «1: пароль правильный «;

if (md5 ($a) === md5 ($c)) echo «2: пароль правильный «;

Сценарий выведет только первое сообщение, поскольку строки (значит, и их хэш — коды) равны. Рекомендация по использованию этой функции:

  • Пароль не должен храниться в сценарии, тем более в открытом виде. пароль нужно хранить в зашифрованном виде в базе данных или в каком-нибудь файле на диске.
  • Введенный пользователем пароль должен зашифровываться и сравниваться уже с зашифрованной строкой, которая прочитана из файла или базы данных.

Кроме функции md5() можно использовать функцию crypt() , которая реализует алгоритм DES , но данный алгоритм менее эффективен, поэтому для серьезных проектов не применяется.

Функция crc32 () используется для вычисления 32 — битной контрольной суммы строки. Данная функция пригодна для регистрации программного продукта через Internet , является стандартной, и менее рекомендуема для серьезных проектов.

Какая функция корректно сравнивает две подстроки

К строкам в языке С++ можно применять операции сравнения.

Эти операции сравнивают два объекта 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *