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

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

  • автор:

Сравнение 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%)
  • Как добавить нули до определённого размера строки (RANDOM — 14.3%)

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

Всем привет.
объясню на примере:

char aaa = 'я'; if( aaa == 255 ) cout "равно";

«я» имеет значение в таблице анси 255(насколько я знаю..) как сравнить?
Re: как сравнить char с значение в симола в ansi ?

От: spine http://ruby.inuse.ru
Дата: 15.03.07 14:27
Оценка: 1 (1)
char aaa = 'я'; if( aaa == 'я' ) cout "равно";

Re: как сравнить char с значение в симола в ansi ?

От: Ruweb
Дата: 15.03.07 14:34
Оценка:

ой, не 255 а 127 я равно.

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

Re[2]: как сравнить char с значение в симола в ansi ?

От: Sm0ke ksi
Дата: 15.03.07 14:37
Оценка:

Здравствуйте, Ruweb, Вы писали:

R>ой, не 255 а 127 я равно.

R>это нужно для оптимизации, мне нужно проверять принадлежит ли значение к буквам, а чтоб не проверять равно ли оно а б в г и т.д. просто сравнить с дапозоном чисел, например русские буквы распологаются от 94 по 127 (к примеру) и значение это в этим диапозоне, то оно удовлетворяет условие

char ch= 'ф'; if (ch >= 'а' && ch 'я' || ch >= 'А' && ch 'Я') < std::cout "эта буква русского алфавита" 

Re[2]: как сравнить char с значение в симола в ansi ?

От: spine http://ruby.inuse.ru
Дата: 15.03.07 14:40
Оценка:

ну дак напиши так:

char c = 'я'; if( c >= 94 && c

или даже можно так:

char c = 'я'; if( c >= 'а' && c 'я' ) <>

Re: как сравнить char с значение в симола в ansi ?

От: Дмитрий Полищук
Дата: 15.03.07 14:45
Оценка: -1

R>»я» имеет значение в таблице анси 255(насколько я знаю..)
правильно

R>как сравнить?
использовать unsigned char, т.к.

char aaa = 'я'; if( aaa == 255 ) // здесь будет aaa = -1, // т.к. char это знаковый тип занимающий 1 байт (-128..127), // а вот unsigned char это беззнаковый тип и тоже в один байт (0..255). cout "равно";
unsigned char aaa = 'я'; if( aaa == 255 ) cout "равно";

все будет работать правильно.

Домашнее задание:
1. посмотреть все это в отладчике и прочитать про типы в С
2. учить мат. часть

Re[2]: как сравнить char с значение в симола в ansi ?

От: spine http://ruby.inuse.ru
Дата: 15.03.07 14:53
Оценка:

Знаковый или без знаковый зависит от реализации.
Re[3]: как сравнить char с значение в симола в ansi ?

От: Дмитрий Полищук
Дата: 15.03.07 14:57
Оценка:

S>Знаковый или без знаковый зависит от реализации.

да, по сути эта ветка вообще офтоп и эти проблемы уже поднимались очень много раз, сам когда-то просвещался на счет платформ и работы с файлами.

2Ruweb: юзай поиска, очень классная вещь, проверено

Re: как сравнить char с значение в симола в ansi ?

От: .
Дата: 15.03.07 15:50
Оценка: 1 (1) +1 -1

Ruweb wrote:

> «я» имеет значение в таблице анси 255(насколько я знаю..) как сравнить?
Никак. В ansi нет русских букв.

Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: как сравнить char с значение в симола в ansi ?

От: Андрей Коростелев http://www.korostelev.net/
Дата: 15.03.07 20:17
Оценка:

Здравствуйте, Дмитрий Полищук, Вы писали:

ДП> // т.к. char это знаковый тип занимающий 1 байт (-128..127),

В зависимости от реализации char может быть как signed, так и unsigned.
Если char signed, то значение выражения

char ch = 255;

будет implementation-defined согласно ANSI С++ (4.7/3) и ANSI С (6.3.1.3/3).

Compile-time проверка на знаковость

BOOST_STATIC_ASSERT(CHAR_MIN < 0) // если нужен знаковый char BOOST_STATIC_ASSERT(CHAR_MIN == 0)// если нужен беззнаковый char

Re[2]: ASCII, ANSI

От: Пётр Седов
Дата: 16.03.07 09:48
Оценка:

Здравствуйте, ., Вы писали:
.>В ansi нет русских букв.
ASCII – 7-битная кодировка, содержит только английские буквы.
ANSI (в данном случае) – семейство 8-битных кодировок. Это семейство включает кодировку «code page 1251», она содержит английские и русские буквы. Буква «Я» кодируется числом 223, буква «я» кодируется числом 255. Но так как в MSVC6 char знаковый, то эти числа превращаются в -33 и -1, соответственно.

char YA = 'Я'; assert((unsigned char)YA == 223); assert(YA == -33); char ya = 'я'; assert((unsigned char)ya == 255); assert(ya == -1);

Пётр Седов (ушёл с RSDN)
Re[2]: Является ли знак русской буквой

От: Пётр Седов
Дата: 16.03.07 11:18
Оценка: +1

Здравствуйте, Ruweb, Вы писали:
R>мне нужно проверять принадлежит ли значение к буквам, а чтоб не проверять равно ли оно а б в г и т.д. просто сравнить с дапозоном чисел, например русские буквы распологаются от 94 по 127 (к примеру) и значение это в этим диапозоне, то оно удовлетворяет условие
В Windows 8-битная кодировка для англо/русского текста – это обычно «code page 1251» (реже «code page 866» или UTF-8). В кодировке «code page 1251» русские буквы кодируются так:

буква код
А 192
Б 193
В 194
Е 197
Ё 168
Ж 198
Э 221
Ю 222
Я 223
а 224
б 225
в 226
е 229
ё 184
ж 230
э 253
ю 254
я 255

Поэтому узнать, является ли знак русской буквой, можно так:

// c - знак в кодировке «code page 1251» bool IsRussianLetter(char c) < unsigned char n = static_castunsigned char>(c); // код if (n == 168) return true; // Ё if (n == 184) return true; // ё return (192 // АБВ. ЕЖ. ЭЮЯабв. еж. эюя >

Условие «n Функцию IsRussianLetter можно тестировать так:

// альтернативная реализация bool IsRussianLetter_SimpleButSlow(char c) < if (c == '\0') < return false; > return strchr("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя", c) != NULL; > void Test_IsRussianLetter() < for (int n = 0; n < 256; n++) < assert(IsRussianLetter(n) == IsRussianLetter_SimpleButSlow(n)); >>

Обсуждение аналогичного вопроса: «необходимо определить, является ли буква русской»
Автор: techgl
Дата: 21.01.07
Пётр Седов (ушёл с RSDN)
Re[3]: как сравнить char с значение в симола в ansi ?

От: Centaur
Дата: 19.03.07 08:43
Оценка:

Здравствуйте, Sm0ke, Вы писали:

S>так пойдёт?
S>

S>char ch= 'ф'; S>if (ch >= 'а' && ch 'я' || ch >= 'А' && ch 'Я') S> < S>std::cout "эта буква русского алфавита" > S>

Не будет работать в кодировках, где русские буквы не расположены последовательно. Самые распространённые примеры — cp866 (где между интервалами а-п и р-я есть ещё куча интересного) и koi8-r (где буквы вообще не по порядку).

О кодировках, где русских букв нет в принципе, даже не говорю.

Как сравнивать 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?

Соответственно, интерпретатор выдает: 11, при его выполнении. Из этого можно понять, что не смотря на равенство этих массивов с точки зрения лексикографического сравнения, интерпретатор считает, что чем позже создан массив, тем он больше.
Из этого можно сделать вывод о том, сравнивается непосредственно память, выделенная под этот массив, или нечто иное, а не проводится лексикографическое сравнение, иначе массивы были бы равны.

Объясните, пожалуйста, на этом примере суть использования памяти под массивы, и что же всё-таки такое: сравнение массивов char на C?

  • Вопрос задан более двух лет назад
  • 383 просмотра

Комментировать
Решения вопроса 1

Вы сравниваете указатели (почитайте по них в любой книжке про C).
Указатели - это адреса, на 64-битной системе представляемые 64-битными положительными числами. Как именно и в каком порядке им выдаются значения - внутреннее дело компилятора, но, как правило, адреса переменных на стеке действительно идут в порядке их объявления.

Ответ написан более двух лет назад
Комментировать
Нравится 3 Комментировать
Ответы на вопрос 1

firedragon

Владимир Коротенко @firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.

Вы сами поняли. Тут сравнивается память хотите сравнивать значения сравнивайте их

В более навороченных языках немного хитрее, например в c# для скорости строки неизменные и хранятся в области памяти и дубликаты имеют один адрес

Ответ написан более двух лет назад
Нравится 2 5 комментариев
paroletatel @paroletatel Автор вопроса

Спасибо за ответ!
Но меня именно интересует: почему каждый последующий дубликат занимает больший объем памяти нежели предыдущий?

firedragon

Владимир Коротенко @firedragon

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

paroletatel, не больший объем памяти, а больший адрес. У вас сравниваются адреса выделенной под строки памяти.

firedragon

Владимир Коротенко @firedragon

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

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

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