Сравнение 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 и массива char
Есть ли более лаконичные способы реализации подобного условия? По идее в стандартной библиотеке вероятно должна быть функция возвращающая true / false после поиска символа в массиве символов, но я чет не нашел; а самому раздувать код такой функцией чет не айс. Help
Отслеживать
LevayaNogaKabargi
задан 30 сен 2019 в 7:20
LevayaNogaKabargi LevayaNogaKabargi
79 7 7 бронзовых знаков
регулярку использовать надо
30 сен 2019 в 7:29
регулярку. перефразируйте пожалуйста
30 сен 2019 в 7:31
Нет там такой функции, реализуйте ее самостоятельно. Стоит отметить, что представленный вариант делает совершенно не то, что нужно. Кроме того, если не использовать однобайтовую кодировку, char не может содержать кириллический символ целиком.
30 сен 2019 в 7:34
У меня проблем с 1 байтовым char не было написал setlocale(0,»RU»); и всё. Я б взял массив на 256 символов и заполнил единицами где нужно.
30 сен 2019 в 7:54
Конструкция то есть std::regex_search но это 100% оверкилл.
30 сен 2019 в 7:57
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Как уже сказали, подобное условие априори не работоспособно. Корректный вариант выглядел бы как:
if ((name[i] == 'У') || (name[i] == 'Е' )|| (name[i] == 'Ё') /*|| . */)
Во-вторых, использование кириллицы в исходниках сопрежено с определёнными сложностями, но т.к. вопрос не об этом, то предполагаю, что используется какая-то однобайтовая 8-битная локаль. Для переносимости в данном случае нужно будет испоьзовать широкие символы ( wchar_t ).
Есть ли более лаконичные способы реализации подобного условия?
Да, в стандартной библиотеке есть strchr :
if (strchr("УЕЁЫАОЭЯИЮЬЪуеёыаоэяиюьъ", name[i])) // .
Если символ найден, то она возвращает указатель на первое вхождение символа в строку, что является не нулевым значением, а следовательно означает истинность. В противным случае она возвращает NULL , что равносильно ложности условия.
Аналогичная многобайтовая функция зовётся wcschr() .
В чём суть сравнения массивов типа char на C?
Соответственно, интерпретатор выдает: 11, при его выполнении. Из этого можно понять, что не смотря на равенство этих массивов с точки зрения лексикографического сравнения, интерпретатор считает, что чем позже создан массив, тем он больше.
Из этого можно сделать вывод о том, сравнивается непосредственно память, выделенная под этот массив, или нечто иное, а не проводится лексикографическое сравнение, иначе массивы были бы равны.
Объясните, пожалуйста, на этом примере суть использования памяти под массивы, и что же всё-таки такое: сравнение массивов char на C?
- Вопрос задан более трёх лет назад
- 471 просмотр
Комментировать
Решения вопроса 1
Вы сравниваете указатели (почитайте по них в любой книжке про C).
Указатели — это адреса, на 64-битной системе представляемые 64-битными положительными числами. Как именно и в каком порядке им выдаются значения — внутреннее дело компилятора, но, как правило, адреса переменных на стеке действительно идут в порядке их объявления.
Ответ написан более трёх лет назад
Комментировать
Нравится 3 Комментировать
Ответы на вопрос 1
Владимир Коротенко @firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Вы сами поняли. Тут сравнивается память хотите сравнивать значения сравнивайте их
В более навороченных языках немного хитрее, например в c# для скорости строки неизменные и хранятся в области памяти и дубликаты имеют один адрес
Ответ написан более трёх лет назад
Нравится 2 5 комментариев
paroletatel @paroletatel Автор вопроса
Спасибо за ответ!
Но меня именно интересует: почему каждый последующий дубликат занимает больший объем памяти нежели предыдущий?
Владимир Коротенко @firedragon
paroletatel, попробуйте suzeof и увидите что вы не совсем правы. Просто адрес различается. Это все равно что развоз заказов по одной улице в дома 3,4,5 доставляют 5 банок пива Амстердам навигатор, но адреса то различные
paroletatel, не больший объем памяти, а больший адрес. У вас сравниваются адреса выделенной под строки памяти.
Владимир Коротенко @firedragon
Александр Ананьев, кстати забавно как повлияли современные языки на людей, даже базовые понятия для них проблема
Как сравнивать 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 (где буквы вообще не по порядку).
О кодировках, где русских букв нет в принципе, даже не говорю.