transform() mit toupper geht nicht



  • Hallo,

    also ich habe jetzt schon seit gut einer stunde die threads zu einem solchen thema durchsucht aber überall klappt das was bei mir nicht klappt. ich will einfach nur einen eingegeben string in großbuchstaben ausgeben, mit transform();
    hier mein code:

    #include<iostream>
    #include<string>
    #include<cctype>
    #include<algorithm>
    
    using namespace std;
    
    int main()
    {
        string wort;
    
        cout<<"Geben sie einen string ein"<<endl;
        cin>>wort;
    
        transform(wort.begin(),wort.end(),wort.begin(),toupper);
    
        cout<<wort<<endl;
    
        return 0;
    }
    

    hier der fehler:

    C:\Dokumente und Einstellungen\kruc\Desktop\Desktop\Verschiedenes\Cpp\main.cpp:17: error: no matching function for call to `transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unknown type>)'

    ich kann damit gar nix anfangen, kann mir einer helfen?



  • toupper() ist in C++ eine überladene Funktion (neben der Version aus C gibt es noch eine zweite, die einen zusätzlichen locale Parameter übergeben bekommt) - und damit kommt der Compiler hier nicht zurecht. Versuch's mal mit einer Wrapper-Hilfsfunktion:

    inline char cToUpper(char c)
    {
      return toupper(c);
    }
    
    ...
    transform(wort.begin(),wort.end(),wort.begin(),cToUpper);
    


  • ja ok so geht es, aber was komisch ist, ich sehe immer sehr viele lösungen in denen mit toupper und tolower gearbeitet wird, warum geht das dann jetzt nicht. und dann mal noch eine frage, was issen eine inline funktion?



  • Man kann's auch so machen:

    std::string word;
    
    std::transform(word.begin(), word.end(), word.begin(), std::ptr_fun<int, int>(std::toupper));
    


  • Firefighter schrieb:

    ja ok so geht es, aber was komisch ist, ich sehe immer sehr viele lösungen in denen mit toupper und tolower gearbeitet wird, warum geht das dann jetzt nicht.

    Vielleicht weil es einige Compiler gibt, die das etwas anders gelöst haben.

    und dann mal noch eine frage, was issen eine inline funktion?

    Eine Funktion, die so kompakt ist, daß der Compiler sie direkt in den Aufrufenden Code einkleben kann (im Prinzip wie die #define-Makros in C, aber mit dem ganzen Komfort einer C++ Funktion).


Anmelden zum Antworten