Großschreibung?



  • Hi,

    nehmen wir mal an ich ab so einen string:

    std::string = "Dies ist ein Test 123456789";
    

    und eine Funktion soll daraus das hier machen:

    std::string = "DIES IST EIN TEST 123456789";
    

    Kennt da jemand ne funktion?



  • Also bei C++ gibts die _strupr-Funktion (Ob die allerdings mit Unterstrich aufgerufen wird, weiß ich nicht genau)

    char *_strupr( char *string );
    wchar_t *_wcsupr( wchar_t *string );
    unsigned char *_mbsupr( unsigned char *string );

    Routine Required Header
    _strupr <string.h>
    _wcsupr <string.h> or <wchar.h>
    _mbsupr <mbstring.h>

    (Ausschnitt aus der MSDN-Library)



  • for(string::iterator i=str.begin();i!=str.end();++i)
      *i=toupper(*i);
    

    PS: Das _ heist, dass es non standard ist und es ist teil des Funktionsnamen.



  • transform(str.begin(), str.end(), toupper);
    

    oder so ähnlich müßte auch gehen.



  • oder für chars

    #include <locale>
    //...
    char tmp[] = "abcdef";
    
    use_facet<ctype<char> >(locale()).toupper(tmp, tmp+sizeof(tmp));
    


  • Wie soll die Funktion das Wort "groß" in Großbuchstaben umwandeln? Nach deutscher Rechtschreibung ist einzig und allein "GROSS" richtig, "GROß" ist falsch (und sieht nebenbei furchtbar aus). "GROSS" hat aber ein Zeichen mehr.

    Das ist nur eins der Probleme, die beim Umwandeln in Großbuchstaben auftreten.



  • cd9000 schrieb:

    Wie soll die Funktion das Wort "groß" in Großbuchstaben umwandeln? Nach deutscher Rechtschreibung ist einzig und allein "GROSS" richtig, "GROß" ist falsch (und sieht nebenbei furchtbar aus). "GROSS" hat aber ein Zeichen mehr.
    Das ist nur eins der Probleme, die beim Umwandeln in Großbuchstaben auftreten.

    so ein quatsch aber auch.
    wie manche wissen, wird der geburtsort in ausweisen GROSS gedruckt. die stadt gießen wied als "GIEßEN" gedruckt. da bin ich sicher, denn ein solcher ausweis liegt mir vor.
    ist es jetzt so, daß alle ämter da einen fehler machen? oder machst du einen fehler? oder ist deutsch am ende eine lebende sprache, die nicht so perfekt zu toten köpfen paßt?



  • vergesst den muell den cd9000 redet, gross war nie richtig und wird auch niemals richtig sein, weder nach alter rechtschreibung noch nach neuer.

    Es heißt groß, nicht gross! IMMER



  • Jester schrieb:

    transform(str.begin(), str.end(), toupper);
    

    oder so ähnlich müßte auch gehen.

    Da fehlt nocht der Ausgabe-Iterator:

    transform(s.begin(), s.end(), s.begin(),toupper);
    

    So ist das aber nicht portabel. So ist's besser:

    #include <algorithm>
    #include <cctype>
    #include <string>
    using namespace std;
    struct my_toupper
    {
    char operator()(char c) const
    {
        return toupper(static_cast<unsigned char>(c));
    }
    };
    
    int main()
    {
        string s("Hallo");
        transform(s.begin(), s.end(), s.begin(),my_toupper());
    
    }
    


  • Was cd9000 angesprochen hat, ist nicht unwesentlich.
    Von mir aus kann man sich über ß -> SS streiten (wobei ich glaube, dass er da Recht hat. Wenn ich mich nicht täusche, schreiben Ämter nur generell Großbuchstaben und wollen nicht deshalb das ß verlieren).
    Tatsache ist, dass sich die Länge des Strings bei so einer Operation durchaus ändern kann, vor allem auch in anderen Sprachen.

    Deshalb ist z.B. ein Java-String genau auf sowas ausgelegt:
    http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#toUpperCase(java.util.Locale)

    Converts all of the characters in this String to upper case using the rules of the given Locale. Case mapping is based on the Unicode Standard version specified by the Character class. Since case mappings are not always 1:1 char mappings, the resulting String may be a different length than the original String.



  • small letter sharp s -> two letters: SS



  • So ist das aber nicht portabel.

    Da seh ich jetzt nicht direkt was daran falsch sein sollte, könntest du etwas genauer sein?



  • würde mich stören, wenn tolower(toupper(s))!=tolower(s)



  • @Optimizer bestimmt Java nun die deutsche Rechtschreibung? Nicht nur Verlage und Politik streiten drüber jetzt mischt sich auch noch Java ein das kann ja heiter werden.



  • volkard schrieb:

    würde mich stören, wenn tolower(toupper(s))!=tolower(s)

    Tja, ist aber so.



  • The toupper() function has as a domain a type int, the value of which is representable as an unsigned char or the value of EOF. If the argument has any other value, the behavior is undefined. If the argument of toupper() represents a lowercase letter, and there exists a corresponding uppercase letter (as defined by character type information in the program locale category LC_CTYPE ), the result shall be the corresponding uppercase letter. All other arguments in the domain are returned unchanged.

    Das bedeutet, das einzige Problem, das auftreten kann, ist, dass Umlaute und sonstige Sonderzeichen trotz locale nicht erkannt werden und klein zurückkommen. Aber auch das lässt sich umgehen, indem man statt std::string std::basic_string<unsigned char> benutzt.

    Oh, und es ist natürlich immer tolower(toupper(s)) == tolower(s).



  • interpreter schrieb:

    volkard schrieb:

    würde mich stören, wenn tolower(toupper(s))!=tolower(s)

    Tja, ist aber so.

    tja, ist aber nicht im deutschen nach cd9000 so. dort wird aus "GIESSEN" wieder ein "gießen". den weg, daß aus ß immer SS wird, aber aus SS nie wieder ein ß, finde ich befremdlich. aber das scheint im moment der von euch geforderte weg zu sein. und das nur, weil rechner noch recht doof sind. dann trage ich gerne der doofheit rechnung und erlaube ß in grossschrift (ja, ßs statt sss).



  • volkard schrieb:

    würde mich stören, wenn tolower(toupper(s))!=tolower(s)

    Bitte? Was erwartest du den bei "Bauernsepp".toUpper().toLower(); ? Ich erwarte "bauernsepp". Wenn du jetzt wieder "Bauernsepp" erwartest, muss ich dich leider enttäuschen: Das sind keine reversiblen Operationen und das war auch nie so gedacht. Komsiche Vorstellung, sorry...

    *** schrieb:

    @Optimizer bestimmt Java nun die deutsche Rechtschreibung? Nicht nur Verlage und Politik streiten drüber jetzt mischt sich auch noch Java ein das kann ja heiter werden.

    Ne, Java hält sich nur an gängige Standards.



  • 0xdeadbeef schrieb:

    Oh, und es ist natürlich immer tolower(toupper(s)) == tolower(s).

    wie? mit einigen megabytes an wörterbüchern dahinter? oder mit toupper("Gießen")=="GIEßEN"?



  • Bitte schlagt euch jetzt endlich

    tolower(toupper(s)) == tolower(s)
    

    aus dem Kopf. Das ist Blödsinn.

    tolower(toupper("AbCdEfG")) ist halt nun mal nicht wieder AbCdEfG. Weil ein String nach tolower halt nun mal nur Kleinbuchstaben enthält. Das ist ja wohl der Sinn des Ganzen.


Log in to reply