2012-02-07 36 views
6

Bir başka kütüphaneye ihtiyaç duyduğunda, dizeleri yineleyen veya bir good one numaralı karşılaştırmayı içeren büyük/küçük harf karşılaştırması yapılmasının bir yolu olduğunu biliyorum. Bunu yüklememiş olabilecek başka bilgisayarlara koymam gerek. Bunu yapmak için standart kütüphaneleri kullanmanın bir yolu var mı? Şu anda sadece büyük ölçüde benim kod okunabilirliği ve kullanılabilirliğini geliştirmek ...Büyük/küçük harf duyarsız dize karşılaştırması 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; 
} 

Bu yapıyorum. Şimdiye kadar okuduğunuz için teşekkürler.

+2

Cidden? Yerleşik bir yol olmasa bile, her bir karşılaştırmayı zorlamaktan ziyade, bunu yapmak için * bir işlev yazabilirsiniz. Dizeleri arasında yinelemenin nesi var? Kullanacağınız kütüphane zaten böyle olacak. –

+3

stricmp her yerde kullanılabilir. – arx

+0

Kullanılabilir standart kitaplıklar, ikili kodunuzu derlemek için kullanmayı planladığınız C++ derleyicisinin hangi sürümüne bağlı olarak değişir. Örneğin, C++ 0x, regex desteğine sahiptir. Eski derleyiciler için stricmp'i kullanabilirsiniz. – Alan

cevap

15

strncasecmp

strcasecmp() fonksiyon karakter durum göz ardı dizeleri s 1 ve s2bir bayt-bayt karşılaştırma yapar. s1, s2'dan daha küçük, eşleşecek veya daha büyük olacak şekilde sırasıyla sıfırdan küçük, eşittir veya sıfırdan büyük bir tamsayı döndürür. o s1 ve s2en fazla n bayt ...

+0

Teşekkürler, bu sonunda işe yaradı! – CoffeeRain

+3

@CoffeeRain: Çok hoş geldiniz! Mambo-jumbo C++ makarnası üzerinde basit bir eski okul C fonksiyonunu beğendiğinize sevindim :) –

+0

boş mu olmalıydı? – nfoggia

2

Neden her şeyi küçük harf yapmıyorsunuz ve sonra karşılaştırıyorsunuz?

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

Bunu deniyordum, ama çok iyi çalışmıyordu. Bir örnek verebilir misiniz? Hata kodumu göndermeye çalışacağım ... – CoffeeRain

6

genellikle ben gibi, söz konusu dizenin bir alt kasalı sürümü karşılaştırmak olduğunu ne: Ben boost yerleşik küçük dönüşümler inanıyoruz

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

, bu yüzden :

#include <boost/algorithm/string.hpp>  

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

Boost, bağlantı kurduğum şeydi ... Buna sahip değilim. – CoffeeRain

+0

güçlendirme her anlamda ücretsizdir, eğer bir sebepten ötürü yükleyemezseniz, to_lower algoritmasını buradan çıkartabilirsiniz. –

+1

"to_lower" öğesinin dönüş değeri geçersiz. Önce to_lower'ı uygulamanız ve ardından her zamanki gibi karşılaştırmanız gerekir. Gcc'de, yukarıdakiler 'hata olması gerektiği için göz ardı edilmemesi gereken' bir boşluk değeri verecektir. – Fadecomic

2

Sen mevcut dizeyi dönüştürmek için basit işlevi yazabilirsiniz karşılaştırır dışında

strncasecmp() fonksiyonu, benzer küçük harf şöyle:

#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

sadece bu yazdım, belki de birilerine faydalı olabilir:

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; 
} 
İlgili konular