Как сравнивать char в c
Перейти к содержимому

Как сравнивать char в c

Сравнение char со строкой в C++

1. Сравнение char со строкой в кавычках в C++

C++ поддерживает два типа строковых представлений:

  • Строки символов в стиле C
  • Класс string представленный со стандартным C++.

Строка символов в стиле C возникла в языке C и продолжает поддерживаться в C++. Эта строка на самом деле является одномерным массивом символов, который заканчивается нулевым символом '\0'. Таким образом, строка с нулевым символом в конце содержит символы, которые составляют строку, за которой следует ноль.

Следующее объявление и инициализация создают строку, состоящую из слова «Hello». Чтобы содержать нулевой символ в конце массива, размер массива символов, содержащего строку, на один больше, чем количество символов в слове «Hello».

Если вы следуете правилу инициализации массива, вы можете написать приведённое выше утверждение следующим образом:

Итак, char может использоваться для хранения строк наравне с экземплярами класса string, которые также хранят строки. Но тип char, как мы только что рассмотрели, являются не совсем обычными строками и в некоторых ситуациях они ведут себя не совсем так, как мы интуитивно ожидаем. Рассмотрим следующий пример кода:

Интуитивно представляется, что должна быть выведена надпись «Строки равны!», но на практике этого не происходит, то есть условие first_string == "sum" является false.

Объяснение: в C строка — это указатель на область памяти, которая содержит байты. Сравнение char* с char* с использованием оператора равенства не будет работать должным образом, потому что вы сравниваете места в памяти строк, а не их байтовое содержимое.

2. Сравнение char и string в C++

Первый способ решения указанной проблемы сравнения char — это сравнивать её не со строкой в кавычках, а с экземпляром класса string, то есть переменной, являющейся string.

Следующий код отработает так, как ожидается:

3. Конвертация char и string в C++

При присвоении значения char переменной типа string, она конвертируется в string — при этом даже не нужно использовать специальные функции — это происходит автоматически. А переменные типа string ведут себя более интуитивно предсказуемо (так, как мы привыкли в других языках программирования), в следующем коде значение переменной char мы присваиваем строке и уже эту строку сравниваем с "sum":

В результате будет выведено:

4. Сравнение char в функции strcmp()

Функция strcmp() будет перебирать обе строки, проверяя их байты, чтобы увидеть, равны ли они. strcmp() вернёт 0, если они равны, и ненулевое значение, если они различаются.

Обратите внимание, что в следующем коде нам не нужно использовать заголовок #include <string>, но мы используем заголовок #include <cstring>, поскольку он содержит функцию strcmp:

В результате будет выведено «Строки равны!».

Выводы

char нельзя непосредственно сравнивать со строкой в кавычках, поскольку это даст неправильный результат. char можно сравнивать с переменной типа string, либо присвоить значение переменной типа string и затем сравнить со строкой в кавычках, либо можно использовать функцию strcmp для сравнения char со строкой в кавычках.

Char. Compare To Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Сравнивает данный экземпляр с заданным объектом или типом значения и показывает, расположен ли данный экземпляр перед, после или на той же позиции в порядке сортировки, что и заданный объект или тип значения.

Перегрузки

Сравнивает данный экземпляр с заданным объектом Char и показывает, расположен ли данный экземпляр перед, после или на той же позиции в порядке сортировки, что и заданный объект Char.

Сравнивает данный экземпляр с заданным объектом и показывает, расположен ли данный экземпляр перед, после или на той же позиции в порядке сортировки, что и заданный объект Object.

CompareTo(Char)

Сравнивает данный экземпляр с заданным объектом Char и показывает, расположен ли данный экземпляр перед, после или на той же позиции в порядке сортировки, что и заданный объект Char.

Параметры

Объект Char для сравнения.

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

Число со знаком, которое показывает позицию данного экземпляра в порядке сортировки по отношению к параметру value .

Возвращаемое значение Описание
Меньше нуля Данный экземпляр предшествует параметру value .
Нуль Данный экземпляр имеет ту же позицию в порядке сортировки, что и value .
Больше нуля Данный экземпляр стоит после параметра value .
Реализации

Примеры

В следующем примере кода показаны универсальные и не универсальные версии CompareTo метода для нескольких типов значений и ссылочных типов.

Комментарии

Этот метод реализует System.IComparable<T> интерфейс и выполняет немного лучше, Char.CompareTo чем метод, так как ему не нужно преобразовывать value параметр в объект.

Сравнение, выполняемое этим методом, основано на закодированных значениях данного экземпляра, а value не на их лексикографических характеристиках.

CompareTo Если тип параметра метода имеет меньше битов (является более узким), чем тип экземпляра, некоторые языки программирования выполняют неявное расширение преобразования, которое преобразует значение параметра в значение с большим количеством битов.

Например, предположим, что тип экземпляра и Int32 тип параметра — Byte. Компилятор Microsoft C# создает инструкции для представления значения параметра в виде Int32 объекта, а затем создает метод, который сравнивает Int32.CompareTo значения Int32 экземпляра и Int32 представление параметра.

Как правило, неявные преобразования расширения выполняются для числовых типов. Обратитесь к документации по языку программирования, чтобы определить, выполняет ли компилятор расширенные преобразования. Если несоответствие типов экземпляров и параметров и подходящее преобразование недоступно, компилятор создает инструкции для поля параметра и вызова CompareTo перегрузки, принимающей Object параметр.

C++ Как сравнить два массива типа char?

Нужно ввести группу. Далее перебрать структура, найти запись с совпадающей группой и вывести её.

Делал проверку, цикл выполняется нужное количество раз, а вот условие вообще ни разу.

Почему я не могу сделать сравнение mas_Z[i].n_group == kodS ?

P.S. Ввел небольшое недрзумение с kodS . Всё из-за моей невнимательности. kodS заменил на kodG .

UPDATE

Возвращает «TRUE». Если использовать strcmp :

Возвращает 0 . Это положительный результат проверки

Но вообще, если это С++ (судя по тегу), то может иметь смысл избавиться от массивов символов и перейти на std::string .

Как в соседнем ответе заметили, в scanf(«%s», &kodG); символ & — лишний. Хотя он здесь создает неопределенное поведение, на практике на работу программы он влиять не должен, по идее.

user avatar

Использование оператора & с форматом %s в scanf — почти всегда ошибка

Что здесь делает этот & ?

либо (если угодно)

но ни в коему случае не то, что у вас. «На практике» ваш вариант может работать, но это не повод писать подобное.

Использование массива размером всего 5 для пользовательского ввода через scanf(«%s» — это серьезная заявка на переполнение буфера со всеми вытекающими. Сделайте хотя бы

Сравнение С-строк в С++ делается так же как и в С: функцией strcmp .

Почему я не могу сделать сравнение mas_Z[i].n_group == kodG

Кто вам такое сказал? Вы можете сделать такое сравнение. Только сравнивать оно будет не содержимое строк, а значения двух указателей (и они, разумеется, будут не равны). А уж что именно вы хотели сравнить — строки или указатели — это у вас надо спрашивать. Компилятор за вас додумывать не будет, он просто делает то, что вы ему сказали делать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *