Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
900
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6088
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Сравнение строк без учета регистра в C++
Как лучше всего выполнить сравнение строк без учета регистра в C++ без преобразования строки во все прописные или все строчные буквы?
Просьба указать, насколько эти методы удобны для использования в Юникоде и насколько они портативны.
Boost включает в себя удобный алгоритм для этого:
#include <boost/algorithm/string.hpp>
// Or, for fewer header dependencies:
//#include <boost/algorithm/string/predicate.hpp>
std::string str1 = "hello, world!";
std::string str2 = "HELLO, WORLD!";
if (boost::iequals(str1, str2))
{
// Strings are identical
}
Воспользуйтесь преимуществами стандарта char_traits . Напомним, что std::string -это фактически typedef для std::basic_string<char>, или более явно, std::basic_string<char, std::char_traits<char> > . Тип char_traits описывает, как символы сравниваются, как они копируются, как они разыгрываются и т. д. Все , что вам нужно сделать, это ввести новую строку поверх basic_string и предоставить ей свой собственный пользовательский char_traits , который сравнивает регистр нечувствительно.
struct ci_char_traits : public char_traits<char> {
static bool eq(char c1, char c2) { return toupper(c1) == toupper(c2); }
static bool ne(char c1, char c2) { return toupper(c1) != toupper(c2); }
static bool lt(char c1, char c2) { return toupper(c1) < toupper(c2); }
static int compare(const char* s1, const char* s2, size_t n) {
while( n-- != 0 ) {
if( toupper(*s1) < toupper(*s2) ) return -1;
if( toupper(*s1) > toupper(*s2) ) return 1;
++s1; ++s2;
}
return 0;
}
static const char* find(const char* s, int n, char a) {
while( n-- > 0 && toupper(*s) != toupper(a) ) {
++s;
}
return s;
}
};
typedef std::basic_string<char, ci_char_traits> ci_string;
Подробности - на Гуру недели № 29 .
Проблема с boost заключается в том, что вам приходится связываться с boost и зависеть от него. В некоторых случаях это непросто (например, android).
А использование char_traits означает, что все ваши сравнения нечувствительны к регистру, а это обычно не то, что вы хотите.
Этого должно быть достаточно. Она должна быть достаточно эффективной. Однако он не обрабатывает unicode или что-то еще.
bool iequals(const string& a, const string& b)
{
unsigned int sz = a.size();
if (b.size() != sz)
return false;
for (unsigned int i = 0; i < sz; ++i)
if (tolower(a[i]) != tolower(b[i]))
return false;
return true;
}
Обновление: бонусная версия C++14 ( #include <algorithm> ):
bool iequals(const string& a, const string& b)
{
return std::equal(a.begin(), a.end(),
b.begin(), b.end(),
[](char a, char b) {
return tolower(a) == tolower(b);
});
}
Если вы находитесь в системе POSIX, вы можете использовать strcasecmp . Эта функция не является частью стандарта C, хотя и не доступна на Windows. Это будет выполнять сравнение без учета регистра на 8-битных символах, пока locale является POSIX. Если locale не является POSIX, то результаты не определены (поэтому он может выполнить локализованное сравнение, а может и нет). Эквивалент широкого символа недоступен.
В противном случае большое количество исторических реализаций библиотеки C имеют функции stricmp() и strnicmp(). Visual C++ на Windows переименовал все эти объекты, добавив к ним префикс с подчеркиванием, поскольку они не являются частью стандарта ANSI, поэтому в этой системе они называются _stricmp или _strnicmp . Некоторые библиотеки могут также иметь широкий характер или многобайтовых эквивалентных функций (обычно называемых например, wcsicmp, mbcsicmp и так далее).
C и C++ в основном не знают о проблемах интернационализации, поэтому хорошего решения этой проблемы нет, кроме как использовать стороннюю библиотеку. Проверьте IBM ICU (International Components for Unicode) , если вам нужна надежная библиотека для C/C++. ICU is для систем Windows и Unix.
Вы имеете в виду тупое сравнение без учета регистра или полное нормализованное сравнение Unicode?
Тупое сравнение не найдет строк, которые могут быть одинаковыми, но не являются двоичными равными.
Пример:
U212B (ANGSTROM SIGN)
U0041 (LATIN CAPITAL LETTER A) + U030A (COMBINING RING ABOVE)
U00C5 (LATIN CAPITAL LETTER A WITH RING ABOVE).
Все они эквивалентны, но также имеют различные бинарные представления.
Тем не менее, нормализация Юникода должна быть обязательным чтением, особенно если вы планируете поддерживать хангыль, Таи и другие азиатские языки.
Кроме того, IBM в значительной степени запатентовал наиболее оптимизированные алгоритмы Юникода и сделал их общедоступными. Они также поддерживают реализацию: IBM ICU