Сравнение строк.
Библиотека <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Как сравнивать char в c
Сравнение значения char.C++
#include #include #include #include using namespace std; int main()Как сравнить значение массива s с s1. Функция strcmp сравнивает количество символов тоесть как если я ввел букву а и б он пренимает для них одно значение. А мне нужно их сравнить чтоб программа могла отличить а от б! Помогите пожалуйста!
. Сила воли ключ идеальности.
Последний раз редактировалось jasul; 28.10.2011 в 13:19 .
Регистрация: 25.10.2011
Сообщений: 3,178
Сообщение от jasul
Функция strcmp сравнивает количество символов
Неправда. И Вы сами уже размещали на этом форуме (правильный) текст, утверждающий иное.
| Abstraction |
| Посмотреть профиль |
| Найти ещё сообщения от Abstraction |
Пользователь
Регистрация: 23.09.2011
Сообщений: 98
Сообщение от Abstraction
Неправда. И Вы сами уже размещали на этом форуме (правильный) текст, утверждающий иное.
Я так считаю я не утверждаю.Я сделал такой вывод по результатом этого кода ввожу букву "а" выполняеn функций if пишу букву "b" он также выполняет функцию иф а чем это говорит. пишу две буквы bb функция if не выполняется. Этого говорит мне что функция strcmp шитает количество символов и только.
. Сила воли ключ идеальности.
C++,DirectX/OpenGL
Форумчанин
Регистрация: 09.01.2011
Сообщений: 422
strcmp в случае равенства строк вернет 0, значит в условии нужно поставить проверку на 0 :
if ( strcmp(s,s1) == 0 ) cout
Или просто логическое отрицание, т.к. условие if должно быть верно :
if ( !strcmp(s,s1)) cout
Сравнение char со строкой в C++
1. Сравнение char со строкой в кавычках в C++
C++ поддерживает два типа строковых представлений:
- Строки символов в стиле C
- Класс string представленный со стандартным C++.
Строка символов в стиле C возникла в языке C и продолжает поддерживаться в C++. Эта строка на самом деле является одномерным массивом символов, который заканчивается нулевым символом '\0'. Таким образом, строка с нулевым символом в конце содержит символы, которые составляют строку, за которой следует ноль.
Следующее объявление и инициализация создают строку, состоящую из слова «Hello». Чтобы содержать нулевой символ в конце массива, размер массива символов, содержащего строку, на один больше, чем количество символов в слове «Hello».
char greeting[6] = ;
Если вы следуете правилу инициализации массива, вы можете написать приведённое выше утверждение следующим образом:
char greeting[] = "Hello";
Итак, char может использоваться для хранения строк наравне с экземплярами класса string, которые также хранят строки. Но тип char, как мы только что рассмотрели, являются не совсем обычными строками и в некоторых ситуациях они ведут себя не совсем так, как мы интуитивно ожидаем. Рассмотрим следующий пример кода:
#include using namespace std; int main () < char first_string[] = "sum"; if (first_string == "sum") < cout >
Интуитивно представляется, что должна быть выведена надпись «Строки равны!», но на практике этого не происходит, то есть условие first_string == "sum" является false.
Объяснение: в C строка — это указатель на область памяти, которая содержит байты. Сравнение char* с char* с использованием оператора равенства не будет работать должным образом, потому что вы сравниваете места в памяти строк, а не их байтовое содержимое.
2. Сравнение char и string в C++
Первый способ решения указанной проблемы сравнения char — это сравнивать её не со строкой в кавычках, а с экземпляром класса string, то есть переменной, являющейся string.
Следующий код отработает так, как ожидается:
#include #include using namespace std; int main () < char first_string[] = "sum"; string second_string = "sum"; if (first_string == second_string) < cout >
Строки равны!
3. Конвертация char и string в C++
При присвоении значения char переменной типа string, она конвертируется в string — при этом даже не нужно использовать специальные функции — это происходит автоматически. А переменные типа string ведут себя более интуитивно предсказуемо (так, как мы привыкли в других языках программирования), в следующем коде значение переменной char мы присваиваем строке и уже эту строку сравниваем с "sum":
#include #include using namespace std; int main () < char first_string[] = "sum"; string real_string = first_string; if (real_string == "sum") < cout >
В результате будет выведено:
Строки равны!
4. Сравнение char в функции strcmp()
Функция strcmp() будет перебирать обе строки, проверяя их байты, чтобы увидеть, равны ли они. strcmp() вернёт 0, если они равны, и ненулевое значение, если они различаются.
Обратите внимание, что в следующем коде нам не нужно использовать заголовок #include , но мы используем заголовок #include , поскольку он содержит функцию strcmp:
#include #include using namespace std; int main () < char first_string[] = "sum"; if (strcmp(first_string, "sum") == 0) < cout >
В результате будет выведено «Строки равны!».
Выводы
char нельзя непосредственно сравнивать со строкой в кавычках, поскольку это даст неправильный результат. char можно сравнивать с переменной типа string, либо присвоить значение переменной типа string и затем сравнить со строкой в кавычках, либо можно использовать функцию strcmp для сравнения char со строкой в кавычках.
Смотрите также онлайн учебник «Основы С++».
Связанные статьи:
- Как ввести в cin строки с пробелами в С++ (100%)
- Почему в C++ для double в числе только 5 цифр после запятой (85.7%)
- Доступ к аргументам командной строки в C++ (85.7%)
- Как записать символы строки в обратном порядке (64.3%)
- Как в Bash проверить, содержит ли строка подстроку (64.3%)
- Как сделать и отправить изменения исходного кода на GitHub (RANDOM - 50%)
В чём суть сравнения массивов типа char на C?
Соответственно, интерпретатор выдает: 11, при его выполнении. Из этого можно понять, что не смотря на равенство этих массивов с точки зрения лексикографического сравнения, интерпретатор считает, что чем позже создан массив, тем он больше.
Из этого можно сделать вывод о том, сравнивается непосредственно память, выделенная под этот массив, или нечто иное, а не проводится лексикографическое сравнение, иначе массивы были бы равны.
Объясните, пожалуйста, на этом примере суть использования памяти под массивы, и что же всё-таки такое: сравнение массивов char на C?
- Вопрос задан более двух лет назад
- 392 просмотра
Комментировать
Решения вопроса 1
Вы сравниваете указатели (почитайте по них в любой книжке про C).
Указатели - это адреса, на 64-битной системе представляемые 64-битными положительными числами. Как именно и в каком порядке им выдаются значения - внутреннее дело компилятора, но, как правило, адреса переменных на стеке действительно идут в порядке их объявления.
Ответ написан более двух лет назад
Комментировать
Нравится 3 Комментировать
Ответы на вопрос 1

Владимир Коротенко @firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Вы сами поняли. Тут сравнивается память хотите сравнивать значения сравнивайте их
В более навороченных языках немного хитрее, например в c# для скорости строки неизменные и хранятся в области памяти и дубликаты имеют один адрес
Ответ написан более двух лет назад
Нравится 2 5 комментариев
paroletatel @paroletatel Автор вопроса
Спасибо за ответ!
Но меня именно интересует: почему каждый последующий дубликат занимает больший объем памяти нежели предыдущий?

Владимир Коротенко @firedragon
paroletatel, попробуйте suzeof и увидите что вы не совсем правы. Просто адрес различается. Это все равно что развоз заказов по одной улице в дома 3,4,5 доставляют 5 банок пива Амстердам навигатор, но адреса то различные
paroletatel, не больший объем памяти, а больший адрес. У вас сравниваются адреса выделенной под строки памяти.

Владимир Коротенко @firedragon
Александр Ананьев, кстати забавно как повлияли современные языки на людей, даже базовые понятия для них проблема