std::ctype<char>::blank



  • hi leute

    ist es normal das std::ctype<char>::blank fuer '\n' true zurueck gibt ?

    folgender code:

    std::cout << isblank('\n') << std::endl << std::endl; // (1)
       std::cout << std::use_facet<std::ctype<char>>(std::cout.getloc()).is(std::ctype<char>::blank, '\n') << std::endl << std::endl; //(2)
    

    (1) gibt 0 zurueck und (2) gibt 1(true) zurueck.
    laut der tabelle auf http://www.cplusplus.com/reference/cctype/ sollte blank nur fuer '\t' und ' ' true zurueck geben.

    verwende VC++ 2017 Community 15.1

    Meep Meep


  • Mod

    Du bist mir aber ein Greenhorn. Genau wie für alle anderen Klassifizierungsfunktionen aus <cctype> muss das Argument als unsigned char repräsentierbar sein, d.h. du musst es nach unsigned char casten.



  • Arcoth schrieb:

    Du bist mir aber ein Greenhorn. Genau wie für alle anderen Klassifizierungsfunktionen aus <cctype> muss das Argument als unsigned char repräsentierbar sein, d.h. du musst es nach unsigned char casten.

    std::ctype::is
    bool is (mask m, char_type c) const;
    

    http://www.cplusplus.com/reference/locale/ctype/is/ <- auf der seite sieht man auch ein beispiel. hier wird ein (in meinem fall) char erwartet.
    ein '\n' nach unsigned char casten würde auch nix aendern, weil es sowieso einen positiven wert hat.

    bei ::isblank müsste man acht geben wenn der zeichen als char negative waere.



  • hab jetzt mal mit Clang und gcc getestet. beide geben zeile (2) false raus.


  • Mod

    Erstmal ist es voellig unerheblich, dass du mit sowohl GCC als auch Clang getestet hast, da sicherlich beide standardmaessig libstdc++ verwenden. Zweitens ist das sowieso richtig. Das default C locale klassifiziert newline nicht als blank. VC++ scheint wohl einen Bug zu haben, oder ein spezielles Locale (was auch ein Bug sein koennte).

    Meep Meep schrieb:

    Arcoth schrieb:

    Du bist mir aber ein Greenhorn. Genau wie für alle anderen Klassifizierungsfunktionen aus <cctype> muss das Argument als unsigned char repräsentierbar sein, d.h. du musst es nach unsigned char casten.

    std::ctype::is
    bool is (mask m, char_type c) const;
    

    http://www.cplusplus.com/reference/locale/ctype/is/ <- auf der seite sieht man auch ein beispiel. hier wird ein (in meinem fall) char erwartet.
    ein '\n' nach unsigned char casten würde auch nix aendern, weil es sowieso einen positiven wert hat.

    bei ::isblank müsste man acht geben wenn der zeichen als char negative waere.

    Na auf ::isblank habe ich mich ja auch bezogen. std::ctype kommt wohl kaum aus <cctype>.


Log in to reply