2012-02-07 44 views
6

大文字小文字を区別する方法があることはわかっています。文字列を反復するか、good oneには別のライブラリが必要です。私はそれがインストールされていないかもしれない他のコンピュータにこれを置く必要があります。これを行うために標準ライブラリを使用する方法はありますか?今すぐやっています...大文字と小文字を区別しない文字列の比較C++

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

これは私のコードの可読性と使いやすさを大幅に向上させる可能性があります。これまで読んでくれてありがとう。

+2

真剣に?組み込みの方法がない場合でも、それぞれの個別の比較を強制するのではなく、簡単に関数を書くことができます。文字列を繰り返し処理すると何が問題になりますか?これは、あなたが使用しようとしているライブラリがとにかくやることです。 –

+3

stricmpはどこからでも入手できます。 – arx

+0

利用可能な標準ライブラリは、バイナリのコンパイルに使用するC++コンパイラのバージョンによって異なります。たとえば、C++ 0xは正規表現をサポートしています。古いコンパイラでは、stricmpを使用できます。 – Alan

答えて

15

strncasecmp

strcasecmp()関数は、文字の場合を無視して、文字列S1とs2のバイトごとの比較を行います。それぞれs1が見つかった場合は、より小さいか、一致するか、またはs2より大きい整数である場合は、0より小さい、等しい、または大きい整数を返します。

strncasecmp()機能は、それがS1S2のこれ以上ののn よりもバイトを比較することを除いて、似ている...

+0

ありがとう、これはついに働いた! – CoffeeRain

+3

@ CoffeeRain:あなたは大歓迎です!私はあなたがmambo-jumbo C++マカロニより単純な古い学校のCの機能を好きになってうれしく思っています:) –

+0

それは空白になっていますか? – nfoggia

2

あなたはすべて小文字にして比較してみませんか?

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

私はそれを試みていましたが、うまく機能しませんでした。例を教えてください。エラーコードを投稿しようとします... – CoffeeRain

6

のように、通常は私がやっていることは、単に、問題の文字列の下のケースに入れたバージョンを比較している:私はブーストが組み込まれている小文字の変換と信じ

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

ので、 :

#include <boost/algorithm/string.hpp>  

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

ブーストは私がリンクしているものでした...私はそれを持っていません。 – CoffeeRain

+0

boostはあらゆる意味で無料ですが、何らかの理由でインストールできない場合は、そこからto_lowerアルゴリズムを取得できます。 –

+1

'to_lower'の戻り値はvoidです。最初に 'to_lower'を適用してから、いつものように比較する必要があります。 gcc上では、上記のように、エラーであるはずの 'void値は無視されません'。 – Fadecomic

2

あなたが既存の文字列を変換する簡単な関数を書くことができます

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

を私は多分それは誰かに役立つことができ、これを書いた:

次のように下ケース
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; 
} 
関連する問題