String mit anderem vergleichen, Gross-Kleinschreibung ignorieren



  • Hallo!
    Ich möchte in einer Funktion den ersten Buchstaben eines Strings mit einem
    anderen String vergleichen, der nur aus einem Grossbuchstaben besteht.
    Der Vergleich soll aber nicht berücksichtigen, ob der erste Buchstabe
    gross oder klein ist.
    Momentan hab ich es so gelöst:

    void cGameList::FillFolders()
    {
        //Walk through m_GameMap, and compare the foldername with the first letter of the
        //game, converted to uppercase
        std::string GameFirstCharacter;
        for (m_MapIter = m_GameMap.begin(); m_MapIter != m_GameMap.end(); ++m_MapIter)
        {
            GameFirstCharacter = (m_MapIter->first).substr(0, 1);
            std::transform(GameFirstCharacter.begin(), GameFirstCharacter.end(), GameFirstCharacter.begin(), (int(*)(int)) std::toupper);
    
            if (GameFirstCharacter == FolderName)
            {
                cOsdItem* GameName = new cOsdItem((m_MapIter->first).c_str());
                Add(GameName);
            }
        }
    }
    

    FolderName ist hier ein Grossbuchstabe. Die anderen Strings kommen aus einer
    std::map. Es sind über 6000 Einträge.
    Gibt es vielleicht noch einen schnelleren und eleganteren Weg, bei dem ich
    nicht zwischenspeichern muss?



  • warum speicherst du den einen buchstaben in einem string, wenn du gleich einen char nehmen könntest?

    if (toupper(m_MapIter->first[0]) == FolderName)
    


  • Wenn ich es so mache, krieg ich
    ISO-C++ verbietet Vergleich zwischen Zeiger und Ganzzahl
    Foldername ist ein const char*.



  • So ging es:

    if (std::toupper(m_MapIter->first[0]) == FolderName[0])
    

    Gibt es noch eine einfache Möglichkeit, festzustellen, ob das erste Zeichen
    eine Zahl ist? Es reicht aus, dass true geliefert wird, wenn es 0-9 ist.
    Ich wollte das eigentlich so machen:
    Da eine std::map eh alphabetisch speichert, wollte ich so lange abfragen,
    bis das "A" kommt, also:

    if (std::toupper(m_MapIter->first[0]) != 'A')
    

    Nachtrag: Ging nicht, der Ordner ist dann immer leer. Kann sein, dass die
    map die Zahlen hinten speichert.
    Muss ich morgen mal gucken.



  • das ist wohl ein dirty hack. sich auf die map und deren sortierung zu verlassen, um zu prüfen, ob das erste zeichen eine ziffer ist.

    google mal nach isdigit und isalpha.



  • std::tr1::regex? 🙄



  • Danke!
    isdigit macht genau das!


Anmelden zum Antworten