Как сравнивать 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?
Соответственно, интерпретатор выдает: 11, при его выполнении. Из этого можно понять, что не смотря на равенство этих массивов с точки зрения лексикографического сравнения, интерпретатор считает, что чем позже создан массив, тем он больше.
Из этого можно сделать вывод о том, сравнивается непосредственно память, выделенная под этот массив, или нечто иное, а не проводится лексикографическое сравнение, иначе массивы были бы равны.
Объясните, пожалуйста, на этом примере суть использования памяти под массивы, и что же всё-таки такое: сравнение массивов char на C?
- Вопрос задан более двух лет назад
- 345 просмотров
Комментировать
Решения вопроса 1
Вы сравниваете указатели (почитайте по них в любой книжке про C).
Указатели — это адреса, на 64-битной системе представляемые 64-битными положительными числами. Как именно и в каком порядке им выдаются значения — внутреннее дело компилятора, но, как правило, адреса переменных на стеке действительно идут в порядке их объявления.
Ответ написан более двух лет назад
Комментировать
Нравится 3 Комментировать
Ответы на вопрос 1

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

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

Владимир Коротенко @firedragon
Александр Ананьев, кстати забавно как повлияли современные языки на людей, даже базовые понятия для них проблема
Сравнение char с char
Здравствуйте помогите пожалуйста решить проблему.
В общем не работает сравнение фамилии и телефона(что-то с переменной char), а конкретно он тупо не видит сходства между двумя переменными.
(Строки 69 и 89) Поиск по фамилии и телефону.
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
/*Описать класс «записная книжка». Предусмотреть возможность работы с произвольным числом записей, поиска записи по какому-либо признаку (например, по фамилии, дате рождения или номеру телефона), добавления и удаления записей, сортировки по разным полям. Написать программу, демонстрирующую работу с этим классом. Программа может содержать меню, позволяющее осуществить проверку всех методов класса. */ #include #include #include using namespace std; class Notebook { public: char* famil; int db, mb, yb; char* phone; Notebook() { famil = new char[20]; phone = new char[15]; } void Input() { cout "Введите фамилию: "; cin >> famil; cout "Введите дату рождения: (День, Месяц, Год): "; cin >> db >> mb >> yb; cout "Номер телефона: "; cin >> phone; } void Out() { cout "Фамилия: " famil endl; cout "Дата рождения: " db "." mb "." yb endl; cout "Телефон: " phone endl; } }; int main() { cout "zashlo"; SetConsoleCP(1251); SetConsoleOutputCP(1251); Notebook List[50]; int IdList=0; int swch = 1; while (swch != 0) { system("cls"); cout "1. Поиск записи (по Фамилии, Дате рождения, Телефону) \n2. Добавление или удаление записи \n3. Сортировка по разными полям \n0.Выход\n"; cin >> swch; system("cls"); switch (swch) { case 1: { int n=0; char famil_tmp[20]; char phone_tmp[15]; int dd = 0, mm = 0, yy = 0; cout "1. Поиск по фамилии \n2. Поиск по дате рождения \n3. Поиск по телефону\n"; cin >> n; if (n == 1) { cout "Введите фамилию: "; cin >> Fam; for (int i = 0; i 50; i++) { if (List[i].famil == famil_tmp) { List[i].Out(); _getch(); } } } else if (n == 2) { cout "Введите дату рождения: (День, Месяц, Год): "; cin >> dd >> mm >> yy; for (int i = 0; i 50; i++) { if (List[i].db == dd && List[i].mb == mm && List[i].yb == yy) { List[i].Out(); _getch(); } } } else { cout "Введите номер: "; cin >> phone_tmp; for (int i = 0; i 50; i++) { if (List[i].phone == phone_tmp) { List[i].Out(); _getch(); } } } } break; case 2: { int n = 0; cout "1. Добавить запись \n2. Удалить запись\n"; cin >> n; if (n == 1) { List[IdList].Input(); IdList++; } else { } } break; } } }
Как сравнивать 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