transform mit tolower



  • Morgen,

    ich habe mal wild im forum zu transform und tolower/toupper gesucht, weil ich es für eine stringfunktion brauche, jedoch musste ich feststellen das mancher code aus einigen Threads so nicht mehr funktioniert.
    Beispiel

    std::string wort("HALLO");
    std::transform(wort.begin(),wort.end(),wort.begin(),tolower);
    

    dieser code geht jetzt in meinem programm nicht mehr. Meine Frage ist, warum? Und was muss ich machen um den gezielten Effekt wieder herzuleiten?

    Schönen Morgen wünsche ich.



  • Was geht denn nicht?



  • Das Problem ist AFAIR, dass der Parametertyp von 'tolower' ein ungünstig überladen ist. Caste den Funktionszeiger mal explizit, dann müsste es funktionieren:

    transform(s.begin(), s.end(), s.begin(), static_cast<int (*)(int)>(toupper));
    


  • t\main.cpp:11: 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>)'

    so das ist der fehler. früher konnte ich das so wie oben problem nutzen, jetzt jedoch muss ich immer diesen zusatz von

    transform(wort.begin(),wort.end(),wort.begin(),static_cast<int (*)(int)>(tolower));
    

    dazu schreiben und ich weiß nicht warum auf einmal?



  • also so geht es bei mir...warum auch immer...

    #include <iostream>
    #include <string>
    
    int main(void)
    {
    	std::string word = std::string("HELLO");
    	std::transform(word.begin(), word.end(), word.begin(), tolower);
    	std::cout << word << std::endl;
    
    	return 0;
    }
    


  • Basingstoke schrieb:

    also so geht es bei mir...warum auch immer...

    Bei mir geht das auch (sogar mit „-Wall -pedantic“ unter GCC 4.2) aber das ist irrelevant, wenn es unter anderen Compilern nicht funktioniert. Außerdem fehlt bei dem Code der Header <algorithm>. Dass man den bei GCC zufälligerweise hier nicht extra einbinden muss, ist unglücklich.



  • das is ja eigenartig...also ist das compilerabhängig? ich benutze CodeBlocks mit mingw, kann es also daran liegen? oder wie ist das zu erklären



  • Müsste es nicht std::tolower heißen?



  • Hast du ein using namespace std drüber stehen. Dann lass das mal weg oder schreibe

    std::transform(wort.begin(),wort.end(),wort.begin(),::tolower);
    


  • alles was bisher gepostet wurde ist falsch. man braucht eine helper-function weil tolower nur mit unsigned char arbeitet



  • @23 könntest du uns diese helper funktion demonstrieren?



  • 23 schrieb:

    alles was bisher gepostet wurde ist falsch. man braucht eine helper-function weil tolower nur mit unsigned char arbeitet

    Na, dann schau Dir die Deklaration von std::tolower nochmal genau an. Da steht nichts von 'unsigned char', die Deklaration aus <cctype> arbeitet mit 'int'. Sauberer wär's natürlich, die Template-'tolower'-Version aus 'locale' zu verwenden.



  • Firefighter schrieb:

    @23 könntest du uns diese helper funktion demonstrieren?

    Wo ist denn da das Problem? Man muss nur nen dummen Wrapper schreiben. Aber wie gesagt: Das ist unnötig.

    char to_upper(char c) { return std::to_upper(c); }
    
    int main() {
        std::string s = "Hallo, Welt";
        std::transform(s.begin(), s.end(), s.begin(), to_upper);
    }
    


  • Konrad Rudolph schrieb:

    23 schrieb:

    alles was bisher gepostet wurde ist falsch. man braucht eine helper-function weil tolower nur mit unsigned char arbeitet

    Na, dann schau Dir die Deklaration von std::tolower nochmal genau an. Da steht nichts von 'unsigned char', die Deklaration aus <cctype> arbeitet mit 'int'.

    irrelevant, da tolower erwartet, dass sich sein parameter als unsigend char darstellen lässt. und da char entweder signeder oder unsigned sein kann, müsstest du zuerst casten.



  • queer_boy schrieb:

    Konrad Rudolph schrieb:

    23 schrieb:

    alles was bisher gepostet wurde ist falsch. man braucht eine helper-function weil tolower nur mit unsigned char arbeitet

    Na, dann schau Dir die Deklaration von std::tolower nochmal genau an. Da steht nichts von 'unsigned char', die Deklaration aus <cctype> arbeitet mit 'int'.

    irrelevant, da tolower erwartet, dass sich sein parameter als unsigend char darstellen lässt. und da char entweder signeder oder unsigned sein kann, müsstest du zuerst casten.

    Ah. Sorry, ich hatte nicht geschaltet, weil ich 'char' in C++ mangels der festgelegten Codierung immer als ASCII-7 betrachte und das achte Bit unbenutzt lasse. Und wenn das höchstwertige Bit 0 ist, dann besteht da ja kein Unterschied.


Log in to reply