372 Stimmen

Groß-/Kleinschreibung unempfindlicher String-Vergleich in C++

Was ist der beste Weg, um case-insensitive String-Vergleich in C++ ohne Umwandlung einer Zeichenfolge in alle Groß- oder Kleinschreibung zu tun?

Bitte geben Sie an, ob die Methoden Unicode-freundlich sind und wie portabel sie sind.

16voto

Brian Rodriguez Punkte 3992

Véase std::lexicographical_compare :

// lexicographical_compare example
#include <iostream>  // std::cout, std::boolalpha
#include <algorithm>  // std::lexicographical_compare
#include <cctype>  // std::tolower

// a case-insensitive comparison function:
bool mycomp (char c1, char c2) {
    return std::tolower(c1) < std::tolower(c2);
}

int main () {
    char foo[] = "Apple";
    char bar[] = "apartment";

    std::cout << std::boolalpha;

    std::cout << "Comparing foo and bar lexicographically (foo < bar):\n";

    std::cout << "Using default comparison (operator<): ";
    std::cout << std::lexicographical_compare(foo, foo + 5, bar, bar + 9);
    std::cout << '\n';

    std::cout << "Using mycomp as comparison object: ";
    std::cout << std::lexicographical_compare(foo, foo + 5, bar, bar + 9, mycomp);
    std::cout << '\n';

    return 0;
}

Demo

14voto

kyb Punkte 5908

Kurz und gut. Keine weiteren Abhängigkeiten, außer erweitert std C lib.

strcasecmp(str1.c_str(), str2.c_str()) == 0

gibt zurück. wahr wenn str1 y str2 gleich sind. strcasecmp möglicherweise nicht existieren, könnte es Analogien geben stricmp , strcmpi , usw.

Beispiel-Code:

#include <iostream>
#include <string>
#include <string.h> //For strcasecmp(). Also could be found in <mem.h>

using namespace std;

/// Simple wrapper
inline bool str_ignoreCase_cmp(std::string const& s1, std::string const& s2) {
    if(s1.length() != s2.length())
        return false;  // optimization since std::string holds length in variable.
    return strcasecmp(s1.c_str(), s2.c_str()) == 0;
}

/// Function object - comparator
struct StringCaseInsensetiveCompare {
    bool operator()(std::string const& s1, std::string const& s2) {
        if(s1.length() != s2.length())
            return false;  // optimization since std::string holds length in variable.
        return strcasecmp(s1.c_str(), s2.c_str()) == 0;
    }
    bool operator()(const char *s1, const char * s2){ 
        return strcasecmp(s1,s2)==0;
    }
};

/// Convert bool to string
inline char const* bool2str(bool b){ return b?"true":"false"; }

int main()
{
    cout<< bool2str(strcasecmp("asd","AsD")==0) <<endl;
    cout<< bool2str(strcasecmp(string{"aasd"}.c_str(),string{"AasD"}.c_str())==0) <<endl;
    StringCaseInsensetiveCompare cmp;
    cout<< bool2str(cmp("A","a")) <<endl;
    cout<< bool2str(cmp(string{"Aaaa"},string{"aaaA"})) <<endl;
    cout<< bool2str(str_ignoreCase_cmp(string{"Aaaa"},string{"aaaA"})) <<endl;
    return 0;
}

Ausgabe:

true
true
true
true
true

13voto

Darren Kopp Punkte 74401

Visual C++ String-Funktionen, die Unicode unterstützen: http://msdn.microsoft.com/en-us/library/cc194799.aspx

derjenige, den Sie wahrscheinlich suchen, ist _wcsnicmp

12voto

Wedge Punkte 19070

ZU IHRER INFORMATION, strcmp() y stricmp() sind anfällig für Pufferüberläufe, da sie nur so lange verarbeitet werden, bis sie auf einen Nullterminator treffen. Sicherer ist es, die _strncmp() y _strnicmp() .

11voto

Dean Harding Punkte 69243

Le site Boost.String Bibliothek verfügt über eine Vielzahl von Algorithmen für die Durchführung von Fall-zu-Fall-Vergleichen und so weiter.

Sie könnten Ihre eigene Lösung einführen, aber warum sollten Sie sich die Mühe machen, wenn es bereits getan wurde?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X