2012-02-07 9 views
6

Wiem, że istnieją sposoby na porównywanie przypadków ignorowania, które wymagają przechodzenia przez ciągi znaków lub jeden kod good one na SO wymaga innej biblioteki. Muszę umieścić to na innych komputerach, które mogą go nie zainstalować. Czy istnieje sposób na wykorzystanie standardowych bibliotek, aby to zrobić? Teraz właśnie robię ...Nieczułe na ciągi literowe porównania 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; 
} 

To może znacznie poprawić czytelność i użyteczność mojego kodu. Dziękuję za przeczytanie tej książki.

+2

Poważnie? Nawet jeśli nie ma wbudowanego sposobu, możesz * łatwo * napisać funkcję, aby to zrobić, zamiast brutalnie wymuszać każde indywidualne porównanie. Co jest nie tak z iterowaniem po strunach? To właśnie będzie robić każda biblioteka, z której będziesz korzystać. –

+3

stricmp jest dostępny wszędzie. – arx

+0

Jakie standardowe biblioteki są dostępne, zależy od wersji kompilatora C++, którego planujesz użyć do kompilacji pliku binarnego. Na przykład C++ 0x ma obsługę regex. Dla starszych kompilatorów możesz użyć stricmp. – Alan

Odpowiedz

15

strncasecmp

Funkcja strcasecmp() wykonuje porównanie bajt bajcie strun S1 i S2ignorując przypadku postaci. Zwraca liczbę całkowitą mniejszą od, równą lub większą od zera, jeśli odpowiednio zostanie znaleziona wartość mniejsza niż, aby dopasować, lub będzie większa niż s2.

Funkcja strncasecmp() jest podobny, poza tym, że porównuje nie więcej niż n bajtów s1 i s2 ...

+0

Dzięki, to w końcu zadziałało! – CoffeeRain

+3

@ CoffeePain: Serdecznie witamy! Cieszę się, że podobała ci się prosta funkcja starej szkoły C nad mambo-jumbo w języku C++ :) –

+0

czy ma być pusta? – nfoggia

2

dlaczego nie zrobić wszystko małymi literami, a następnie porównać?

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

Próbowałem, ale to nie działało bardzo dobrze. Czy możesz podać przykład? Spróbuję opublikować mój kod błędu ... – CoffeeRain

6

zwykle co mam zrobić, to po prostu porównać niższą obudowane wersję napisu w kwestii, jak:

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

wierzę doładowania ma wbudowane małe konwersji, tak :

#include <boost/algorithm/string.hpp>  

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

Wzmocnienie było tym, z którym łączyłem ... Nie mam tego. – CoffeeRain

+0

doładowanie jest darmowe pod każdym względem, możesz po prostu pobrać algorytm to_lower, jeśli nie możesz go zainstalować z jakiegoś powodu. –

+1

Zwracana wartość 'to_lower' jest nieważna. Najpierw musisz zastosować 'to_lower', a następnie porównać jak zwykle. W gcc powyższe daje "wartość pustą nie ignorowaną, jak powinno być". – Fadecomic

2

możesz napisać prostą funkcję do konwersji istniejącego ciąg małymi literami w następujący sposób:

#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

właśnie napisałem to, może to być przydatne dla kogoś:

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