Урок 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, сравнение
Как сравнить две строки типа std::string
Имеются две переменные типа string . Подскажите методы их сравнения.
Хм. Просто взять и сравнить:
Функция strcmp имеет прототип:
После сравнения строк str1 и str2 данная функция возвратит целое значение:
Эта функция производит сравнение, различая прописные и строчные буквы
В результате, на экран будет выведено: 32. Т.к. код символа l = 108, а код символа L = 76. 108-76=32.
Какая функция корректно сравнивает две подстроки
К строкам в языке С++ можно применять операции сравнения.
Эти операции сравнивают два объекта 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. И в данном случае консольный вывод будет следующим
Какая функция корректно сравнивает две подстроки
//Include necessary library
#include<iostream>
usingnamespace std ;
intmain ( ) // Declare a string variable
string url_addr ;
// Take a url address from the user
cout <> url_addr ;
// Compare the input value with another string using equivalent operator
if ( url_addr == «google.com» )
cout << «It is a search engine wensite.» << endl ;
elseif ( url_addr == «jooble.org» )
cout << «It is a job searching website.» << endl ;
elseif ( url_addr == «linuxhint.com» )
cout << «It is a blog website.» << endl ;
else
cout << «No information is added for this site.» << endl ;return0 ;
>
Использование функции compare () для сравнения строки
- Функция вернет 0, если обе сравниваемые строки равны.
- Функция вернет 1, если первая строка больше второй.
- Функция вернет −1, если первая строка меньше второй.
//Include necessary library
#include<iostream>
usingnamespace std ;
intmain ( )
//Initialialize two string variables
string email ( «admin@example.com» ) ;
string password ( «linuxhint» ) ;
//Declare two string variables
string user_email ;
string user_password ;//Take the email address from the user
cout <> user_email ;//Take the password from the user
cout <> user_password ;//Check the username ans the password are valid or invalid
if ( user_email. compare ( email ) == && user_password. compare ( password ) == )
cout << «Authentication Successful.» << endl ;
else
cout << «Email or password is invalid.» << endl ;return0 ;
>
Использование функции strcmp () для сравнения строки
//Include necessary libraries
#include <cstring>
#include <iostream>
usingnamespace std ;
intmain ( ) //Delare two string variables
char chrData1 [ 100 ] , chrData2 [ 100 ] ;//Take the first string data
cout << «Enter the first string:» ;
cin. getline ( chrData1 , 100 ) ;
//Take the second string data
cout << «Enter the second string:» ;
cin. getline ( chrData2 , 100 ) ;if ( strcmp ( chrData1 , chrData2 ) == )
printf ( «The strings are equal \n « ) ;
else
printf ( «The strings are not equal \n « ) ;return0 ;
>