web-dev-qa-db-ja.com

C ++での大文字と小文字を区別しない標準文字列の比較

void
main()
{
    std::string str1 = "abracadabra";
    std::string str2 = "AbRaCaDaBra";

    if (!str1.compare(str2)) {
        cout << "Compares"
    }
}

どうすればこれを機能させることができますか?上記の大文字と小文字を区別しないようにします。関連質問私はグーグルで、ここに

http://msdn.Microsoft.com/en-us/library/zkcaxw5y.aspx

大文字と小文字を区別しないメソッドString :: Compare(str1、str2、Bool)があります。問題は、それが私のやり方とどのように関連しているかです。

7
Santhosh Kumar

述語関数を作成し、それをstd::equalsで使用して比較を実行できます。

bool icompare_pred(unsigned char a, unsigned char b)
{
    return std::tolower(a) == std::tolower(b);
}

bool icompare(std::string const& a, std::string const& b)
{
    if (a.length()==b.length()) {
        return std::equal(b.begin(), b.end(),
                           a.begin(), icompare_pred);
    }
    else {
        return false;
    }
}

今、あなたは簡単に行うことができます:

if (icompare(str1, str)) {
    std::cout << "Compares" << std::endl;
}
21
0x499602D2

両方を小文字に変換して比較します。

下への変換:

for(int i = 0; i < str1.size(); i++)
{
  str[i] = tolower(str[i]);
}

文字列の比較:

if (str1.compare(str2) == 0) { ... }

ゼロの値は、両方の文字列が等しいことを示します。

[〜#〜]編集[〜#〜]

これはforループを回避するために使用できます: http://www.cplusplus.com/reference/algorithm/transform/

std::transform(in.begin(),in.end(),std::back_inserter(out),tolower);
2
Andro