Перейти к содержимому

Как сравнивать строки в си

  • автор:

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

Библиотека &ltcstring&gt предлагает пользователю готовые функции, выполняющие сравнение строк. Далее будут рассмотрены функции, выполняющие посимвольное сравнение двух строк и возвращающие разность кодов первых несовпадающих символов.

Функция strcmp.

Функция strcmp имеет прототип:

int strcmp(const char* str1, const char* str2);
  • 0 , если str1 > str2

Эта функция производит сравнение, различая прописные и строчные буквы

char s1[]="Hello"; char s2[]="HeLlo"; int k=strcmp(s1,s2); cout

В результате, на экран будет выведено: 32. Т.к. код символа l = 108, а код символа L = 76. 108-76=32.

Функция stricmp.

Функция stricmp имеет тот же прототип как и функция strcmp. Отличие этих двух функций лишь в том, что stricmp не различает регистр символов. Т.е. для предыдущего примера на экран выведется 0.

Функция strncmp.

Имеет прототип:
int strncmp(const char* str1, const char* str2, size_t num);

Эта функция сравнивает num первых символов строк, на которые указывают указатели str1 и str2. Пример:

char s1[]="Hello"; char s2[]="HeLlo"; int k=strncmp(s1,s2,2); cout

Сравнение строк в языке C

@pavel char word[40]; scanf("%s", &word[i]); и char **rootie; *rootie = new char[counter2]; for (int i = 0; i > counter2; i++) < for (int j = 0; j >20; j++) < fscanf(roots, "%s", rootie); >> . Ошибку выдает для word.

30 апр 2016 в 14:00

scanf("%s", &word[i]); эм. вы ТОЧНО знаете что делаете? fscanf(roots, "%s", rootie); не представляю как оно компилируется.

30 апр 2016 в 14:06

*rootie = new char[counter2]; - я не уверен что именно это вы и хотели. Может rootie = new char* [counter2]; ? В общем советую весь код сюда выложить и внимательно посмотреть на типы данных (char char * и char **).

30 апр 2016 в 14:11

1 ответ 1

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

Сравнение двух строк в Си выполняется вот так:

#include #include int main()

Отслеживать
ответ дан 1 мая 2016 в 10:36
9,032 2 2 золотых знака 19 19 серебряных знаков 34 34 бронзовых знака

  • c
  • строки
  • char
  • сравнение
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

strcmp , wcscmp , _mbscmp , _mbscmp_l

Функции _mbscmp и _mbscmp_l не могут использоваться в приложениях, запускаемых в среде выполнения Windows. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows.

Синтаксис

int strcmp( const char *string1, const char *string2 ); int wcscmp( const wchar_t *string1, const wchar_t *string2 ); int _mbscmp( const unsigned char *string1, const unsigned char *string2 ); int _mbscmp_l( const unsigned char *string1, const unsigned char *string2, _locale_t locale ); 

Параметры

string1 , string2
Строки с завершающим нулем для сравнения.

locale
Используемый языковой стандарт.

Возвращаемое значение

Возвращаемое значение каждой из этих функций отображает порядковое отношение строки string1 к строке string2 .

Значение string1 Отношение к string2
< 0 string1 меньше string2
0 string1 идентична string2
> 0 string1 больше, чем string2

При ошибке _mbscmp проверки параметров и _mbscmp_l возврате _NLSCMPERROR , который определен в и .

Замечания

Функция strcmp выполняет порядковое сравнение строк string1 и string2 и возвращает значение, которое указывает их отношение. Функции wcscmp и _mbscmp являются версиями функции strcmp для расширенных и многобайтовых символов соответственно. _mbscmp распознает последовательности многобайтовых символов в соответствии с текущей многобайтовой кодовой страницей и возвращает _NLSCMPERROR при ошибке. _mbscmp_l имеет то же поведение, но использует параметр языкового стандарта, переданный вместо текущего языкового стандарта. Дополнительные сведения см. на страницах кода. Кроме того, если string1 или string2 является пустым указателем, _mbscmp вызывает обработчик недопустимых параметров, как описано в разделе проверки параметров. Если выполнение может быть продолжено, то функции _mbscmp и _mbscmp_l возвращают ошибку _NLSCMPERROR и устанавливают для errno значение EINVAL . strcmp и wcscmp не проверяйте их параметры. В остальном эти функции ведут себя одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.

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

TCHAR.H Обычной _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_tcscmp strcmp _mbscmp wcscmp

Функции strcmp отличаются от strcoll функций в strcmp сравнении порядковых значений и не влияют на языковой стандарт. strcoll сравнивает строки лексикографически с использованием категории LC_COLLATE текущего языкового стандарта. Дополнительные сведения о LC_COLLATE категории см. в разделе . _wsetlocale setlocale

В языковом стандарте "C" порядок символов в наборе символов (набор символов ASCII) совпадает с лексикографическим порядком символов. Однако в других языковых стандартах порядок символов в наборе символов может отличаться от лексикографического порядка. Например, в некоторых европейских языковых стандартах символ ' a ' (значение 0x61) приходится перед символом ' ä ' (значением 0xE4) в наборе символов, но символ ' ä ' поставляется перед символом ' a ' лексикографически.

При использовании языковых стандартов, в которых порядок символов в кодировке и лексикографический порядок различаются, используйте strcoll вместо strcmp для лексикографического сравнения строк. Также можно использовать функцию strxfrm для исходных строк, а затем использовать функцию strcmp для результирующих строк.

Функции strcmp учитывают регистр. Функции _stricmp , _wcsicmp и _mbsicmp перед сравнением преобразуют строки в нижний регистр. Две строки, содержащие символы, расположенные между "Z" и "a" в таблице ASCII (" [ , "", " \\ ", " ] ", " ^ ", _ "" и ` ""), сравниваются по-разному в зависимости от их случая. Например, две строки "" и " ABCDE " сравнивают один из способов, если сравнение является строчным (" abcde > abcd^ " "") и другим способом (" ABCDE < ABCD ^"), если сравнение является верхним регистром. ABCD^

Требования

Маршрут Обязательный заголовок
strcmp
wcscmp или
_mbscmp

Дополнительные сведения о совместимости см. в разделе Совместимость.

Библиотеки

Пример

// crt_strcmp.c #include #include #include char string1[] = "The quick brown dog jumps over the lazy fox"; char string2[] = "The QUICK brown dog jumps over the lazy fox"; int main( void ) < char tmp[20]; int result; // Case sensitive printf( "Compare strings:\n %s\n %s\n\n", string1, string2 ); result = strcmp( string1, string2 ); if( result >0 ) strcpy_s( tmp, _countof(tmp), "greater than" ); else if( result < 0 ) strcpy_s( tmp, _countof (tmp), "less than" ); else strcpy_s( tmp, _countof (tmp), "equal to" ); printf( " strcmp: String 1 is %s string 2\n", tmp ); // Case insensitive (could use equivalent _stricmp) result = _stricmp( string1, string2 ); if( result >0 ) strcpy_s( tmp, _countof (tmp), "greater than" ); else if( result
Compare strings: The quick brown dog jumps over the lazy fox The QUICK brown dog jumps over the lazy fox strcmp: String 1 is greater than string 2 _stricmp: String 1 is equal to string 2 

Как сравнивать строки в си

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

Эти операции сравнивают два объекта 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 не будет опубликован. Обязательные поля помечены *