Сравнение строк.
Библиотека <cstring> предлагает пользователю готовые функции, выполняющие сравнение строк. Далее будут рассмотрены функции, выполняющие посимвольное сравнение двух строк и возвращающие разность кодов первых несовпадающих символов.
Функция 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:00scanf("%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:111 ответ 1
Сортировка: Сброс на вариант по умолчаниюСравнение двух строк в Си выполняется вот так:
#include #include int main()Отслеживать
ответ дан 1 мая 2016 в 10:36
8,992 2 2 золотых знака 19 19 серебряных знаков 34 34 бронзовых знака
- c
- строки
- char
- сравнение
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как происходит сравнение строк?
подскажите пожалуйста, как сравниваются строки в плюсах? что там при этом происходит? сравниваются количество символов в строке? то есть где их больше , та и строка больше, или символы сравниваются по ascii? по их кодам?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как реализовать сравнение строк?
Здравствуйте, проблема в том, что я не знаю как сравнить строки в своей программе. Сейчас она.
Как произвести сравнение строк?
Дан текст, в котором есть букви и пропуски. Если в нем нету слова “весна”, то оставить его без.
Сравнение строк как регулярные выражения
Подскажите с виду такая простая задача. Сравнить к примеру строку "temp_" со строкой.
Как реализовать сравнение строк с русскими символами
Дело обстоит так: Нужно сравнить на сходство русские слова. Пробовал strcmp - но она что-то.
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
По порядку, от начала строки сравниваются коды символов.
s1 < s2, если при первом несовпадении символов c1 < c2;
s1 == s2, если все символы совпадают;
s1 > s2, если при первом несовпадении символов c1 > c2;
Если все символы совпадают, но одна из строк закончилась, то больше та строка, в которой символов больше.
Принцип хорошо описан для функции strcmp(), при сравнении string все точно так же.
399 / 73 / 7
Регистрация: 29.01.2018
Сообщений: 1,246
да вы не хуже объяснили,чем описано в strcmp
только вот не пойму один момент: если строка -это массив символов типа char ,то как же этот массив сравнивается с другим массивом то есть с другой строкой? это же не паскаль где можно сравнить два массива просто и без цикла
вобщем вопрос, как сравниваются эти элементы массива без цикла?
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
Сообщение от pcmax
если строка -это массив символов типа char ,то как же этот массив сравнивается с другим массивом то есть с другой строкой?
Массив символов и строка - две разные вещи. У C-string в конце находится '\0' - символ конца строки. В массиве символов это требование может и не выполняться. Без цикла наверное никак не сравнить. Предположу, что и в паскале сравнение строк где-то в глубине реализации разворачивается в цикл. Экземпляры класса string сравниваются операторами сравнения ( < | >| <= | >= | == | != ). C-string сравнить с помощью операторов сравнения не получится, для этого и есть strcmp().
=>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#include #include #include using namespace std; int main() { char c_str_1[] = "abc"; char c_str_2[] = "bbc"; if (strcmp(c_str_1, c_str_2) 0) { cout <" < " ; } else { cout <" >= " ; } string str_1 = "acc"; string str_2 = "abc"; if (str_1 str_2) { cout <" < " ; } else { cout <" >= " ; } return 0; }
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
pcmax, в Си как такового стандартного типа данных string не было, а был массив char с нулем в конце. Для сравнения строк, в стандартной библиотеке Си написали функцию strcmp в которую передаются два указателя на char
от строк которые будут сравниваться, функция проводит лексикографическое сравнение посимвольно в цикле. В С++ совсем обленились и придумали классы. Написали класс string, почесали репу и подумали, что не хотят каждый раз использовать функцию strcmp, а хотят использовать такую фичу C++ как перегрузку операторов. В частности оператора "==". Внутри этой перегрузки и написали strcmp.
В этом и заключается принцип языков высокого уровня, если разматывать в низкую сторону, то там на самом деле тот самый цикл сравнивающий посимвольно строки, только обернутый в сто шуб, чтобы программисту удобнее было)
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
Сообщение от _SayHello
функция проводит лексикографическое сравнение
Лексикографическое относительно алфавита или таблицы символов?
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
valen10, Ну, в целом сравнивает по значению символа в таблице кодировки. Но если я не ошибаюсь, алфавит в этой таблице лежит в лексикографическом порядке.
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
Сообщение от _SayHello
алфавит в этой таблице лежит в лексикографическом порядке
Похоже, что не всегда. Национальная ASCII (Windows-1251) буквы Ёё хранит где-то в стороне от остального алфавита. Поэтому и решил уточнить.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Строка: Подскажите, пожалуйста, как можно реализовать сравнение строк?
я считал с файла слово "хорошо" в массив. И теперь мне нужно сделать условие if.
Как происходит сравнение строк?
Код проверки отсортированности файла со строками КАК ПРОИСХОДИТ СРАВНЕНИЕ СТРОК? ( по длине, по.
Интерфейс IComparable - как в программе происходит сравнение по health
Здравствуйте! Подскажите пожалуйста , как в данной программе происходит сравнение по .
Как происходит сравнение с помощью операторов LSS, LEQ, GTR, GEQ ?
Добрый день. Можете логично объяснить, как происходит сравнение с помощью операторов LSS, LEQ, GTR.
Сравнение строк в Си
Доброе время суток. Нужно помощь в таком вопросе. Задача на обычном Си.
Нужно перебрать строку и сравнить с предложением. И вычислить входят ли буквы с СТРОКИ в Предложения.
Программу написал. Но когда добавляю к счетчику, одинаковое он повторяет:
for(i = 0; a; i++)
for(j = 0; b[j]; j++)
if(a==b[j])k+=1;
Тоесть, если строка : а < вася >а предложение b < вася вася вася>он посчитает :по3 буквы "в" , "а","c","я". А нужно чтоб когда нашел одно прекратился.
7 ответов
15 февраля 2012 года
889 / / 29.05.2009
Для начала разбей предложение на слова, составь массив, отсортируй и удали совпадения. Можно без сортировки, тогда повторений не будет, если правильно тебя понял.
На a; и b[j] в условиях цикла компилятор не ругался?
15 февраля 2012 года
19 / / 15.02.2012
Вот моя программа:
void main()
int i, j, h, k=0, n=0;
char a[80], b[80];
printf("Ведите строку Ведите предложение \nВходят");
else printf("\nНе входят");
Мне нужно изменить выше представленный пример. Компилятор не ругается, все норм работает. Просто считает лишние повторяющие символы(даже пробел)
15 февраля 2012 года
889 / / 29.05.2009
Всегда истинно.
for(i = 0; a; i++)
Всегда а, то есть - тоже истинно, если строка не пустая.
Это точно верный код?
Пишу же, что из предложения нужно удалить повторения до этого. Для этого нужно сделать словарь.
15 февраля 2012 года
19 / / 15.02.2012
for(i = 0; a [ i ] ; i++) Написано правильно. А показывает без i.
Это: "if(a[h]==a[h])n+=1 " счетчик чтоб перебрать сколько символов в стоке, не совсем корректен, но рабочий.
Извините, но не понимаю насчет словаря.
15 февраля 2012 года
106 / / 22.07.2009
Словарь - это тоже в некотором роде массив, только вместо простого целочисленного индекса там используется ключ. Тип ключа задаете сами.
Предлагаю использовать ассоциативный список (название словаря в терминах STL).
// Шаг 1
std :: map < char , int >letterCounter ; // Инициализация списка
// Шаг 2
// пусть при проходе по тексту вы нашли букву, которая есть в строке, и эта буква обозначается letter
std :: map < char , int >:: iterator iter = letter. find ( letter ) ;
if ( iter == letter. end ( ) ) // Если при поиске дошли до конца списка и не нашли букву
letterCounter. insert ( std :: make_pair ( letter, 1 ) ) // Вставляем со счетчиком 1;
else // Иначе
iter - > second ++ ; // Увеличиваем счетчик
// Шаг 3
// Определяем количество букв в словаре
int letterCount = letterCounter. size ( ) ;
Данный пример не только находит все нужные буквы, но еще и считает статистику каждой из них. Можно сделать немного проще:
// Перепишем шаг два:
letterCounter [ letter ] = 1 ;
Здесь если letter есть в списке, то он соответствующее значение заменит на 1. Если его нету в списке, то map его добавит со значением один.
Но тогда лучше вообще использовать другой контейнер, std::set. Действия будут абсолютно аналогичными, только там у элемента контейнера не будет второго поля (у нас это счетчик буквы). Но set я вам оставлю для самостоятельного изучения.
15 февраля 2012 года
19 / / 15.02.2012
Спс большое. Но мне нужно доработать мою программу. некоторые из ваших функций мы не учили еще. Преподаватель заставить переделать 🙁
15 февраля 2012 года
106 / / 22.07.2009
char [ 256 ] dictionary ; //Заметим, что char принимает значение от 0 до 255
for ( i = 0 ; a [ i ] ; i ++ )
for ( j = 0 ; b [ j ] ; j ++ )
<
// Так как вам нужны именно буквы, а не символы, то придется делать проверку, что рассматриваемый символ является буквой.
// Сделаем это самым деревянным способом =)
if ( ( a [ i ] >= 'a' && a [ i ] ( a [ i ] >= 'A' && a [ i ] ( a [ i ] >= 'а' && a [ i ] ( a [ i ] >= 'А' && a [ i ] <
if ( a [ i ] == b [ j ] )
dictionary ( ( int ) a [ i ] ) = 1 ; // С приведением типов знакомы?
>
>
>
// Закончили поиск букв. Теперь у нас в dictionary лежат единички под индексами, которые соответствуют найденным символам.
int letterCount = 0 ;
for ( int i = 0 ; i < 256 ; i ++ )
<
if ( dictionary == 1 )
letterCount ++ ;
>
Все, теперь у нас в letterCount количество букв, которые одновременно встречаются и в строке, и в предложении.