Сравнение строк, нечувствительных к строкам С++

Я знаю, что есть способы сделать сравнение игнорирования 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;
}

Это может значительно улучшить читаемость и удобство использования моего кода. Спасибо, что прочли это.

Ответ 1

strncasecmp

Функция strcasecmp() выполняет побайтное сравнение строк s1 и s2, игнорируя случай символов. Он возвращает целое число, меньшее, равное или большее нуля, если s1 найден, соответственно, меньше, чтобы соответствовать или быть больше, чем s2.

Функция strncasecmp() аналогична, за исключением того, что она сравнивает не более n байтов s1 и s2...

Ответ 2

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

if (foo.make_this_lowercase_somehow() == "stack overflow") {
  // be happy
}

Я считаю, что boost имеет встроенные преобразования в нижний регистр, поэтому:

#include <boost/algorithm/string.hpp>    

if (boost::algorithm::to_lower(str) == "stack overflow") {
  //happy time
}

Ответ 3

почему вы не делаете все в нижнем регистре, а затем сравниваете?

tolower()

  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);

Ответ 4

Вы можете написать простую функцию для преобразования существующей строки в нижний регистр следующим образом:

#include <string>
#include <ctype.h>
#include <algorithm>
#include <iterator>
#include <iostream>

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;
}

Ответ 5

Я просто написал это, может быть, это может быть полезно кому-то:

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;
}

Ответ 6

Я бы рекомендовал использовать регулярное выражение.

Отъезд Boost.Regex.