Как сравнить два слова в строке с
Перейти к содержимому

Как сравнить два слова в строке с

  • автор:

Сравнение строк в .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, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Сравнение строк в C#

Однако эту задачу осложняют факторы, влияющие на сравнение строк:

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

Поля System.StringComparison перечисления представляют следующие варианты:

  • CurrentCulture: сравнение строк с использованием правил сортировки с учетом языка и региональных параметров и текущего языка и региональных параметров.
  • CurrentCultureIgnoreCase: сравнивайте строки с использованием правил сортировки с учетом языка и региональных параметров, текущего языка и региональных параметров и игнорируя регистр сравниваемых строк.
  • InvariantCulture: сравнение строк с использованием правил сортировки с учетом языка и региональных параметров и инвариантного языка и региональных параметров.
  • InvariantCultureIgnoreCase: сравнивайте строки с использованием правил сортировки с учетом языка и региональных параметров, инвариантного языка и региональных параметров и игнорируя регистр сравниваемых строк.
  • Порядковый номер. Сравнение строк с помощью правил сортировки порядковых (двоичных).
  • OrdinalIgnoreCase: сравнивайте строки с использованием правил сортировки порядковых (двоичных) и игнорируя регистр сравниваемых строк.

Примеры C# в этой статье выполняются во встроенном средстве выполнения кода и на площадке Try.NET. Нажмите на кнопку Выполнить, чтобы выполнить пример в интерактивном окне. После выполнения кода вы можете изменить его и выполнить измененный код, снова нажав на кнопку Выполнить. Либо в интерактивном окне выполняется измененный код, либо, если компиляция завершается с ошибкой, в интерактивном окне отображаются все сообщения об ошибках компилятора C#.

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

Порядковые сравнения по умолчанию

Ниже представлены самые распространенные операции по умолчанию:

  • String.Equals
  • String.Equality и String.Inequality, то есть операторы == равенства и != соответственно выполняют регистр, порядковое сравнение. String.Equals имеет перегрузку, в которой StringComparison можно предоставить аргумент для изменения правил сортировки. Это показано в следующем примере:
string root = @"C:\users"; string root2 = @"C:\Users"; bool result = root.Equals(root2); Console.WriteLine($"Ordinal comparison: > and > are <(result ? "equal." : "not equal.")>"); result = root.Equals(root2, StringComparison.Ordinal); Console.WriteLine($"Ordinal comparison: > and > are <(result ? "equal." : "not equal.")>"); Console.WriteLine($"Using == says that > and > are <(root == root2 ? "equal" : "not equal")>"); 

При порядковых сравнениях строк по умолчанию лингвистические правила не учитываются. В них сравнивается двоичное значение каждого объекта Char в двух строках. Таким образом, в порядковом сравнении по умолчанию также учитывается регистр.

Проверка на равенство с использованием String.Equals, а также операторов == и != отличается от сравнения строк с использованием методов String.CompareTo и Compare(String, String). Все они выполняют сравнение с учетом регистра. Однако, хотя тесты на равенство выполняют порядковое сравнение, CompareTo методы Compare и методы выполняют лингвистическое сравнение с учетом языка и региональных параметров с использованием текущего языка и региональных параметров. Очистите намерение кода, вызвав перегрузку, которая явно указывает тип сравнения для выполнения.

Порядковые сравнения без учета регистра

Этот String.Equals(String, StringComparison) метод позволяет указать StringComparison значение StringComparison.OrdinalIgnoreCase для нечувствительного порядкового сравнения регистра. Существует также статический String.Compare(String, String, StringComparison) метод, который выполняет нечувствительное порядковое сравнение регистра, если указать значение StringComparison.OrdinalIgnoreCase аргумента StringComparison . Эти сравнения показаны в следующем коде:

string root = @"C:\users"; string root2 = @"C:\Users"; bool result = root.Equals(root2, StringComparison.OrdinalIgnoreCase); bool areEqual = String.Equals(root, root2, StringComparison.OrdinalIgnoreCase); int comparison = String.Compare(root, root2, comparisonType: StringComparison.OrdinalIgnoreCase); Console.WriteLine($"Ordinal ignore case: > and > are <(result ? "equal." : "not equal.")>"); Console.WriteLine($"Ordinal static ignore case: > and > are <(areEqual ? "equal." : "not equal.")>"); if (comparison < 0) Console.WriteLine($"> is less than >"); else if (comparison > 0) Console.WriteLine($"> is greater than >"); else Console.WriteLine($"> and > are equivalent in order"); 

Эти методы используют соглашения о регистре инвариантного языка и региональных параметров при выполнении нечувствительного порядкового сравнения регистра.

Лингвистические сравнения

Многие методы сравнения строк (например String.StartsWith) используют лингвистические правила для текущего языка и региональных параметров по умолчанию для упорядочивания входных данных. Это лингвистическое сравнение иногда называется «порядком сортировки слов». При выполнении лингвистического сравнения некоторые неэлементные символы Юникода могут иметь специальные весовые значения. Например, дефис «-» может иметь небольшой вес, назначенный ему, чтобы «co-op» и «coop» отображались рядом друг с другом в порядке сортировки. Некоторые непечатные символы элемента управления могут игнорироваться. Кроме того, некоторые символы Юникода могут быть эквивалентны последовательности экземпляров Char . В следующем примере используется фраза «Они танцуют на улице». В немецком языке с «ss» (U+0073 U+0073) в одной строке и «ß» (U+00DF) в другом. Лингвистически (в Windows) буквы «ss» равнозначны немецкому символу эсцет «ß» в языках «en-US» и «de-DE».

string first = "Sie tanzen auf der Straße."; string second = "Sie tanzen auf der Strasse."; Console.WriteLine($"First sentence is >"); Console.WriteLine($"Second sentence is >"); bool equal = String.Equals(first, second, StringComparison.InvariantCulture); Console.WriteLine($"The two strings <(equal == true ? "are" : "are not")>equal."); showComparison(first, second); string word = "coop"; string words = "co-op"; string other = "cop"; showComparison(word, words); showComparison(word, other); showComparison(words, other); void showComparison(string one, string two) < int compareLinguistic = String.Compare(one, two, StringComparison.InvariantCulture); int compareOrdinal = String.Compare(one, two, StringComparison.Ordinal); if (compareLinguistic < 0) Console.WriteLine($"> is less than > using invariant culture"); else if (compareLinguistic > 0) Console.WriteLine($"> is greater than > using invariant culture"); else Console.WriteLine($"> and > are equivalent in order using invariant culture"); if (compareOrdinal < 0) Console.WriteLine($"> is less than > using ordinal comparison"); else if (compareOrdinal > 0) Console.WriteLine($"> is greater than > using ordinal comparison"); else Console.WriteLine($"> and > are equivalent in order using ordinal comparison"); > 

В Windows до .NET 5 порядок сортировки «cop», «coop» и «co-op» изменяется при изменении лингвистического сравнения на порядковое сравнение. Два предложения на немецком языке также сравниваются по-разному при использовании разных типов сравнения. До .NET 5 API глобализации .NET использовали библиотеки национальной поддержки языка (NLS ). В .NET 5 и более поздних версиях API глобализации .NET используют международные компоненты для библиотек Юникода (ICU ), которые унифицируют. Поведение глобализации NET во всех поддерживаемых операционных системах.

Сравнения с использованием определенных языков и региональных параметров

В следующем примере хранятся CultureInfo объекты для региональных параметров en-US и de-DE. Сравнения выполняются с использованием объекта CultureInfo, чтобы учесть язык и региональные параметры. Используемые значения языка и региональных параметров влияют на операции лингвистического сравнения. В следующем примере показаны результаты сравнения двух предложений на немецком с использованием языка и региональных параметров «en US» и «de-DE»:

string first = "Sie tanzen auf der Straße."; string second = "Sie tanzen auf der Strasse."; Console.WriteLine($"First sentence is >"); Console.WriteLine($"Second sentence is >"); var en = new System.Globalization.CultureInfo("en-US"); // For culture-sensitive comparisons, use the String.Compare // overload that takes a StringComparison value. int i = String.Compare(first, second, en, System.Globalization.CompareOptions.None); Console.WriteLine($"Comparing in returns ."); var de = new System.Globalization.CultureInfo("de-DE"); i = String.Compare(first, second, de, System.Globalization.CompareOptions.None); Console.WriteLine($"Comparing in returns ."); bool b = String.Equals(first, second, StringComparison.CurrentCulture); Console.WriteLine($"The two strings <(b ? "are" : "are not")>equal."); string word = "coop"; string words = "co-op"; string other = "cop"; showComparison(word, words, en); showComparison(word, other, en); showComparison(words, other, en); void showComparison(string one, string two, System.Globalization.CultureInfo culture) < int compareLinguistic = String.Compare(one, two, en, System.Globalization.CompareOptions.None); int compareOrdinal = String.Compare(one, two, StringComparison.Ordinal); if (compareLinguistic < 0) Console.WriteLine($"> is less than > using en-US culture"); else if (compareLinguistic > 0) Console.WriteLine($"> is greater than > using en-US culture"); else Console.WriteLine($"> and > are equivalent in order using en-US culture"); if (compareOrdinal < 0) Console.WriteLine($"> is less than > using ordinal comparison"); else if (compareOrdinal > 0) Console.WriteLine($"> is greater than > using ordinal comparison"); else Console.WriteLine($"> and > are equivalent in order using ordinal comparison"); > 

Сравнения с учетом языка и региональных параметров обычно используются для сравнения и сортировки строк, вводимых пользователями. Символы и правила сортировки этих строк могут различаться в зависимости от языкового стандарта компьютера пользователя. Даже строки, содержащие идентичные символы, могут быть отсортированы по-разному, в зависимости от языка и региональных параметров текущего потока.

Лингвистическая сортировка и поиск строк в массивах

Приведенные ниже примеры показывают, как сортировать и искать строки в массиве с помощью лингвистического сравнения, зависящего от текущих значений языка и региональных параметров. Используйте статические методы Array, которые принимают параметр System.StringComparer.

В следующем примере показано, как сортировать массив строк с помощью текущего языка и региональных параметров:

string[] lines = new string[] < @"c:\public\textfile.txt", @"c:\public\textFile.TXT", @"c:\public\Text.txt", @"c:\public\testfile2.txt" >; Console.WriteLine("Non-sorted order:"); foreach (string s in lines) < Console.WriteLine($" "); > Console.WriteLine("\n\rSorted order:"); // Specify Ordinal to demonstrate the different behavior. Array.Sort(lines, StringComparer.CurrentCulture); foreach (string s in lines) < Console.WriteLine($" "); > 

После сортировки массива можно выполнить поиск записей с помощью двоичного поиска. Двоичный поиск начинается с середины коллекции, чтобы определить, какая половина коллекции содержит искомую строку. Каждое последующее сравнение делит оставшуюся часть коллекции пополам. Массив сортируется с использованием StringComparer.CurrentCulture. Локальная функция ShowWhere отображает сведения о том, где была найдена строка. Если строка не найдена, возвращаемое значение указывает, где бы оно находилось, если было бы найдено.

string[] lines = new string[] < @"c:\public\textfile.txt", @"c:\public\textFile.TXT", @"c:\public\Text.txt", @"c:\public\testfile2.txt" >; Array.Sort(lines, StringComparer.CurrentCulture); string searchString = @"c:\public\TEXTFILE.TXT"; Console.WriteLine($"Binary search for >"); int result = Array.BinarySearch(lines, searchString, StringComparer.CurrentCulture); ShowWhere(lines, result); Console.WriteLine($" <(result >0 ? "Found" : "Did not find")> "); void ShowWhere(T[] array, int index) < if (index < 0) < index = ~index; Console.Write("Not found. Sorts between: "); if (index == 0) Console.Write("beginning of sequence and "); else Console.Write($"and "); if (index == array.Length) Console.WriteLine("end of sequence."); else Console.WriteLine($"."); > else < Console.WriteLine($"Found at index ."); > > 

Порядковая сортировка и поиск в коллекциях

Следующий код использует класс коллекции System.Collections.Generic.List для хранения строк. Строки сортируются с помощью метода List.Sort. Этому методу нужен делегат, который сравнивает и упорядочивает две строки. Метод String.CompareTo предоставляет эту функцию сравнения. Запустите пример и следите за порядком. Эта операция сортировки использует порядковую сортировку с учетом регистра. Можно использовать статические методы String.Compare, чтобы указать разные правила сравнения.

List lines = new List < @"c:\public\textfile.txt", @"c:\public\textFile.TXT", @"c:\public\Text.txt", @"c:\public\testfile2.txt" >; Console.WriteLine("Non-sorted order:"); foreach (string s in lines) < Console.WriteLine($" "); > Console.WriteLine("\n\rSorted order:"); lines.Sort((left, right) => left.CompareTo(right)); foreach (string s in lines) < Console.WriteLine($" "); > 

После сортировки по списку строк можно осуществлять двоичный поиск. В приведенном ниже примере показан поиск в отсортированном списке с использованием той же функции сравнения. Локальная функция ShowWhere показывает, где находится или находился бы искомый текст:

List lines = new List < @"c:\public\textfile.txt", @"c:\public\textFile.TXT", @"c:\public\Text.txt", @"c:\public\testfile2.txt" >; lines.Sort((left, right) => left.CompareTo(right)); string searchString = @"c:\public\TEXTFILE.TXT"; Console.WriteLine($"Binary search for >"); int result = lines.BinarySearch(searchString); ShowWhere(lines, result); Console.WriteLine($" <(result >0 ? "Found" : "Did not find")> "); void ShowWhere(IList collection, int index) < if (index < 0) < index = ~index; Console.Write("Not found. Sorts between: "); if (index == 0) Console.Write("beginning of sequence and "); else Console.Write($"and "); if (index == collection.Count) Console.WriteLine("end of sequence."); else Console.WriteLine($"."); > else < Console.WriteLine($"Found at index ."); > > 

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

См. также

  • System.Globalization.CultureInfo
  • System.StringComparer
  • Строки
  • Сравнение строк
  • Глобализация и локализация приложений

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

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

Сравнение строк в 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++ вы найдете в официальной документации.

Как в 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

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

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