Как сравнить char строки
К строкам в языке С++ можно применять операции сравнения.
Эти операции сравнивают два объекта 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
wikiHow работает по принципу вики, а это значит, что многие наши статьи написаны несколькими авторами. При создании этой статьи над ее редактированием и улучшением работали, в том числе анонимно, 23 человек(а).
Количество просмотров этой статьи: 31 807.
В этой статье:
В программных кодах, написанных на языке С, довольно часто сравниваются длины строк, чтобы выяснить, какая строка содержит больше символов. Это пригодится для сортировки данных. Для сравнения строк необходима специальная функция — не используйте != или == .
- strcmp () — эта функция сравнивает две строки и возвращает разницу в количестве символов.
- strncmp () — эта функция аналогична функции strcmp () за исключением того, что сравниваются первые n символов. Она считается более безопасной, поскольку позволяет избежать сбоев из-за переполнений.
Начните программу с необходимых библиотек. Вам понадобятся библиотеки и , а также любые другие библиотеки, необходимые для вашей конкретной программы.
#include #include
Введите функцию int . Она возвращает целое число как результат сравнения длины двух строк.
#include #include int main () >
Определите две строки, которые хотите сравнить. В нашем примере сравним две строки с типом char . Также определите возвращаемое значение как целое число. [1] X Источник информации
#include #include int main () char *str1 = "яблоко"; char *str2 = "апельсин"; int ret; >
Введите функцию сравнения. В нашем примере воспользуемся функцией strncmp () . В ней нужно задать количество измеряемых символов.
#include #include int main () char *str1 = "яблоко"; char *str2 = "апельсин"; int ret; ret = strncmp(str1, str2, 8); /*Сравниваются две строки, длина которых не превышает 8 символов */ >
Введите условный оператор If . Else. Он необходим, чтобы показать, какая строка длиннее. Функция strncmp () вернет число 0 , если длины строк одинаковые, положительное число, если str1 длиннее, и отрицательное число, если str2 длиннее.
#include #include int main () char *str1 = "яблоко"; char *str2 = "апельсин"; int ret; ret = strncmp(str1, str2, 8); if(ret > 0) printf("str1 длиннее"); > else if(ret 0) printf("str2 длиннее"); > else printf("Длины строк равны"); > return(0); >
Racket: Сравнение строк и символов, предикаты
Пусть заголовок вас не смущает: сравнить char и string не получится, ведь это разные типы!
(char? #\c #\b #\a) ; #t (char=? #\a #\b) ; #f (string? "c" "b" "a") ; #t (string=? "a" "b") ; #f
Глядя на этот пример, вы и сами сможете догадаться, как работают функции string=? 🙂
Регистронезависимость
Упомянутые функции сравнивают строки и строковые символы буквально или, как говорят, лексикографически. Однако при работе с текстом часто нужно сопоставлять строки без учёта регистра, или производить регистронезависимое сравнение (case-insensitive comparison). В Racket для каждой функции сравнения есть регистронезависимый вариант, имеющий суффикс -ci ("case-insensitive"):
(string=? "Apple" "apple") ; #f (string-ci=? "Apple" "apple") ; #t (char>? #\C #\b) ; #f (char-ci>? #\C #\b) ; #t
Группы символов
Строковые символы могут быть буквами, цифрами, знаками препинания. Более того, буквы могут принадлежать разным алфавитам, одни из которых имеют разные регистры, к другим же данная концепция в принципе не применима. Получается, что некоторый строковый символ может принадлежать к одной или сразу к нескольким группам символов. Проверить принадлежность к основным группам символов можно с помощью набора предикатов с именами вида char-alphabetic? и char-lower-case? :
(char-alphabetic? #\a) ; #t (char-alphabetic? #\u3BB) ; #t — "λ" это буква, пусть и греческая (char-lower-case? #\a) ; #t (char-lower-case? #\A) ; #f
Предикатов такого вида в Racket больше десятка, почитать обо всех вы сможете в документации.
Отдельных функций, которые бы проверяли, что все символы некоторой строки принадлежат к некоторой группе, Racket не предоставляет. Впрочем, организовать такую проверку довольно просто, если взять функцию andmap , работающую со списками, и объединить со string->list :
(andmap char-alphabetic? (string->list "asd")) ; #t (andmap char-alphabetic? (string->list "r2d2")) ; #f
Если заменить andmap на ormap , то вместо проверки на "все символы…" получится проверка на "хотя бы один символ…"!
Задание
Реализуйте два предиката: password-valid? и password-good? . Оба должны оценивать строку.
password-valid? должен возвращать #t , если строка состоит только из букв и цифр ( char-alphabetic? и char-numeric? ) и при этом имеет ненулевую длину.
password-good? должен возвращать #t , если строка содержит и буквы, и цифры, а длина строки не меньше восьми символов. И, разумеется, хороший пароль должен быть valid!
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Как сравнить char строки
На этом шаге мы рассмотрим сравнение символов, строк и идентификаторов.
Кроме числовых выражений вы можете также сравнивать простые символы, строки и идентификаторы. Рассмотрим следующие сравнения:
'а' < 'b'% Символы "antony" > "antonia" % Строки P1=peter,Р2=sally,P1>Р2 % Литералы (идентификаторы)
Символы
Используя соответствующее значение кода ASCII для каждого символа, Пролог преобразует 'a' Содержание Следующий шаг