2012-02-07 9 views
6

So che ci sono modi per fare case ignora confronto che coinvolgono scorrendo le stringhe o uno good one su SO ha bisogno di un'altra libreria. Ho bisogno di metterlo su altri computer che potrebbero non averlo installato. C'è un modo per usare le librerie standard per fare questo? In questo momento sto solo facendo ...Caso stringa insensitive confronto 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; 
} 

Questo potrebbe migliorare drasticamente la leggibilità e l'usabilità del mio codice. Grazie per aver letto fino a qui.

+2

Seriamente? Anche se non ci fosse un modo integrato, potresti * facilmente * scrivere una funzione per farlo piuttosto che forzare brutalmente ogni confronto individuale. Cosa c'è di sbagliato nel scorrere le stringhe? Questo è ciò che qualsiasi libreria che userete farà comunque. –

+3

stricmp è disponibile ovunque. – arx

+0

librerie Quali standard disponibili dipendono da quale versione di compilatore C++ si pensa di utilizzare per compilare il binario. Ad esempio, C++ 0x ha il supporto regex. Per i compilatori più vecchi, è possibile utilizzare stricmp. – Alan

risposta

15

strncasecmp

La funzione strcasecmp() esegue un confronto byte per byte delle stringhe s1 e s2, ignorando il caso dei caratteri. Restituisce un intero minore, uguale o maggiore di zero se s1 viene trovato, rispettivamente, di essere meno, per abbinare, o essere superiore s2.

La funzione strncasecmp() è simile, tranne che si confronta non più di n byte di s1 e s2 ...

+0

Grazie, finalmente ha funzionato! – CoffeeRain

+3

@ CoffeeRain: sei il benvenuto! Sono contento che ti sia piaciuta una semplice funzione C vecchia scuola su maccheroni C++ mambo-jumbo :) –

+0

si suppone che sia vuoto? – nfoggia

2

Perché non fate tutto minuscolo e quindi confrontare?

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

Ci stavo provando, ma non stava funzionando molto bene. Potresti fornire un esempio? Proverò a pubblicare il mio codice di errore ... – CoffeeRain

6

di solito quello che faccio è solo confrontare una versione in minuscolo della stringa in questione, come:

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

Credo spinta è dotato di conversioni minuscole, così :

#include <boost/algorithm/string.hpp>  

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

Boost è stato quello che ho collegato a ... Non ce l'ho. L'amplificazione – CoffeeRain

+0

è gratuita in tutti i sensi, puoi solo estrarre l'algoritmo to_lower da lì se non riesci a installarlo per qualche motivo. –

+1

Il valore di ritorno di 'to_lower' è nullo. Devi prima applicare "to_lower" e poi confrontare come al solito. Su gcc, quanto sopra ti darà un errore 'valore non ignorato come dovrebbe essere'. – Fadecomic

2

È possibile scrivere una semplice funzione per convertire la stringa esistente minuscole come segue:

#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

ho appena scritto questo, forse può essere utile a qualcuno:

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