2009-07-01 58 views
16

これは前に尋ねられたが見つかりませんでした。 2つのwstringオブジェクトの大文字と小文字を区別しない比較が組み込まれていますか(つまり、std :: wstringのメソッドまたはアルゴリズムを使用していますか?wstringと大文字小文字を区別して比較する

+6

注:例

struct my_wchar_traits: public std::char_traits< wchar_t> { static int compare(const char_type* op1, const char_type* op2, std::size_t num) { // Implementation here... any of the previous responses might help... } }; 

次に、あなた自身の大文字小文字を区別しない文字列を定義します。 – avakar

+1

http://stackoverflow.com/questions/11635/case-insensitive-string-comparison-in-cを参照してください。私はBoostソリューションか、c_strの抽出とwcscasecmp/_wcsicmpの使用をお勧めします。 – Hasturkun

+0

@Hasturkun:リンクありがとう。私はぼんやりとこのことを覚えていました。 – Naveen

答えて

27

あなたが<string.h>

int _wcsnicmp(
    const wchar_t *string1, 
    const wchar_t *string2, 
    size_t count 
); 

で定義されているこの機能を使用することができますが、Microsoftの実装に縛られて気にしない場合は、最高のパフォーマンスをしたい場合は/互換性/機能性の比は、おそらくブーストライブラリ(その一部はとにかくです)を見なければなりません。 (別の質問にdifferent answerから取られた)単純な例:

#include <boost/algorithm/string.hpp> 

std::wstring wstr1 = L"hello, world!"; 
std::wstring wstr2 = L"HELLO, WORLD!"; 

if (boost::iequals(wstr1, wstr2)) 
{ 
    // Strings are identical 
} 
+3

文字列リテラル – mloskot

2

std :: tolower()を使用して文字列を小文字に変換するか、関数wcscasecmpを使用してc_strの大文字と小文字を区別しない比較を実行できます。ここで

はあなたにも直接使用することができます数子の比較です:

struct ci_less_w 
{ 
    bool operator() (const std::wstring & s1, const std::wstring & s2) const 
    { 
     #ifndef _WIN32 
      return wcscasecmp(s1.c_str(), s2.c_str()) < 0; 
     #else 
      return _wcsicmp(s1.c_str(), s2.c_str()) < 0; 
     #endif 
    } 
}; 
+1

標準ライブラリソリューションが求められていたと思います。 –

2

あなたはブースト文字列アルゴリズムライブラリを使用することができます。あなたがregexをやろうとしない限り、そのヘッダのみのライブラリです。だからあなたは非常に簡単にそれを行うことができます。

http://www.boost.org/doc/libs/1_39_0/doc/html/string_algo.html

6

標準ライブラリを使用する:

bool comparei(wstring stringA , wstring stringB) 
{ 
    transform(stringA.begin(), stringA.end(), stringA.begin(), toupper); 
    transform(stringB.begin(), stringB.end(), stringB.begin(), toupper); 

    return (stringA == stringB); 
} 

wstring stringA = "foo"; 
wstring stringB = "FOO"; 
if(comparei(stringA , stringB)) 
{ 
    // strings match 
} 
+11

if(stringA == stringB)は私にコメントを残すように強制します! :) return(stringA == stringB) –

+4

このソリューションは、いくつかの言語では大文字に変換してから別の文字列に変換するときには動作しません。 – Stan

+1

文字列を比較しただけではなく、結果に関係なく実際に両方の文字列を大文字にしています。 'bool compare(const wstring stringA、const wstring stringB)'という署名を付けてメソッドを書いてみて、このアルゴリズムを修正してください。 – Zak

-1

あなたは不一致を使用することができます()またはlexicographical_compare()。これは、アイテム、Effecitve STLにスコット・マイヤーズによって提案された35

+2

その本を持っていない私たちのための例は素晴らしいでしょう。 – Stan

+2

これらの関数のどちらも大文字と小文字を区別しないでデフォルトで比較することはないことに注意してください。大文字小文字を区別せずにそれらの関数に渡す関数を書く必要があります。 – Geerad

2
#include <algorithm> 
#include <string> 
#include <cstdio> 


bool icase_wchar_cmp(wchar_t a, wchar_t b) 
{ 
    return std::toupper(a) == std::toupper(b); 
} 


bool icase_cmp(std::wstring const& s1, std::wstring const& s2) 
{ 
    return (s1.size() == s2.size()) && 
      std::equal(s1.begin(), s1.end(), s2.begin(), 
           icase_wchar_cmp); 
} 



int main(int argc, char** argv) 
{ 
    using namespace std; 

    wstring str1(L"Hello"), str2(L"hello"); 

    wprintf(L"%S and %S are %S\n", str1.c_str(), str2.c_str(), 
       icase_cmp(str1,str2) ? L"equal" : L"not equal"); 

    return 0; 
} 
2

右英語の話?! (!==演算子を使用した場合、または=)あなたは、文字列は常に大文字小文字を区別しないcomparation作ることが必要な場合、私は私の素敵なブースト:)

bool isequal(const std::wstring& first, const std::wstring& second) 
{ 
    if(first.size() != second.size()) 
     return false; 

    for(std::wstring::size_type i = 0; i < first.size(); i++) 
    { 
     if(first[i] != second[i] && first[i] != (second[i]^32)) 
      return false; 
    } 

    return true; 
} 
+3

+1にLのエンコード接頭辞がありません。 (2番目の[32])は面白いです。私はこれがasciiの設計方法であることは知らなかった! – Sahas

+0

これは、 '['は '{'、 '*'は改行と同じであると考えられますが、他の多くのそのような不正確さもあります。また、ワイド文字列を扱うときに英語を仮定するのは間違いです。 ASCIIの場合は – interjay

+0

が動作しますが、wchar_tの場合は?そうでないかもしれない? – Nayan

1

となるだろうが、その後、可能なエレガントな解決策はchar_traitsを再定義することです。 :メソッドを比較する。

独自の構造を定義します。その大文字と小文字を区別しない比較はロケールに依存している、

typedef std::basic_string< wchar_t, my_wchar_traits> my_wstring; 
関連する問題