Нечувствительное к строкам сравнение строк C ++
Я знаю, что есть способы сделать сравнение игнорирования case, которое включает итерацию по строкам или один хороший на SO, нуждается в другой библиотеке. Мне нужно поместить это на другие компьютеры, которые, возможно, не были установлены. Есть ли способ использовать стандартные библиотеки для этого? Прямо сейчас я просто делаю …
if (foo == "Bar" || foo == "bar") { cout << "foo is bar" << endl; } else if (foo == "Stack Overflow" || foo == "stack Overflow" || foo == "Stack overflow" || foo == "etc.") { cout << "I am too lazy to do the whole thing..." << endl; }
Это может значительно улучшить читаемость и удобство использования моего кода. Спасибо, что прочитали это далеко.
- Препроцессор C ++: избегать повторения кода списка переменных-членов
- Найти неактивный GameObject по имени, тегу или слою
- Почему операторы присваивания возвращают значение?
- Каков правильный способ отмены асинхронной операции, которая не принимает CancellationToken?
- Что такое конструктор копирования в C ++?
- Можно ли «прыгать» / «пропустить» в отладчике GDB?
- Мульти-арендатор с кодом First EF6
- Динамические данные, связывающие данные
- чтение строки с пробелами с помощью sscanf
- c popen не поймает stderr
- Что такое Objective C ++?
- Можно ли использовать «classic» malloc () / free () в приложениях Objective-C / iPhone?
- Как создать статический class в C ++?
strncasecmp
Функция
strcasecmp()
выполняет побайтное сравнение строк s1 и s2 , игнорируя случай символов. Он возвращает целое число меньше, равное или больше нуля, если s1 найдено соответственно, чтобы быть меньше, соответствовать или быть больше, чем s2 .Функция
strncasecmp()
аналогична, за исключением того, что она сравнивает не более n байтов s1 и s2 …
обычно то, что я делаю, просто сравнивает версию с нижней строкой строки, о которой идет речь, например:
if (foo.make_this_lowercase_somehow() == "stack overflow") { // be happy }
Я считаю, что boost имеет встроенные преобразования в нижнем регистре, поэтому:
#include if (boost::algorithm::to_lower(str) == "stack overflow") { //happy time }
почему бы вам не сделать все в нижнем регистре, а потом сравнить?
понижать()
int counter = 0; char str[]="HeLlO wOrLd.\n"; char c; while (str[counter]) { c = str[counter]; str[counter] = tolower(c); counter++; } printf("%s\n", str);
Вы можете написать простую функцию для преобразования существующей строки в нижний регистр следующим образом:
#include #include #include #include #include std::string make_lowercase( const std::string& in ) { std::string out; std::transform( in.begin(), in.end(), std::back_inserter( out ), ::tolower ); return out; } int main() { if( make_lowercase( "Hello, World!" ) == std::string( "hello, world!" ) ) { std::cout << "match found" << std::endl; } return 0; }
Я просто написал это, может быть, это может быть полезно кому-то:
int charDiff(char c1, char c2) { if ( tolower(c1) < tolower(c2) ) return -1; if ( tolower(c1) == tolower(c2) ) return 0; return 1; } int stringCompare(const string& str1, const string& str2) { int diff = 0; int size = std::min(str1.size(), str2.size()); for (size_t idx = 0; idx < size && diff == 0; ++idx) { diff += charDiff(str1[idx], str2[idx]); } if ( diff != 0 ) return diff; if ( str2.length() == str1.length() ) return 0; if ( str2.length() > str1.length() ) return 1; return -1; }