Wie wandle ich einen String in Großbuchstaben um?



  • Hallo,

    wie der Titel schon sagt, suche eine Möglichkeit einen String in einen Großbuchstaben umzuwandeln.
    Eine mögliche Lösung ist ja die Buchstaben einzeln mit der Funktion toupper() in Großbuchstaben umzuwandeln, aber ich suche eine bessere Funktion, die auch Umlaute usw umwandelt.

    z.B. so: (Hier nur ein Demo zu Umwandlung eines C++ string.)
    //---------------------------------------------------------

    > // toupper.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    > //
    > #include "stdafx.h"
    > #include <iostream>
    > #include <string>
    > using namespace std;
    > int _tmain(int argc, _TCHAR* argv[])
    > {string name,NAME;
    > name = "";
    > cin>>name;
    > NAME = "";
    > for (unsigned int i = 0;i<name.length();i++)// Umwandlung in GROSS
    > {NAME = NAME+(char)toupper(name[i]); // klappt nicht bei Umlauten
    > }
    > cout<<"Eingabe: "<<name<<" Grossgeschrieben: "<<NAME<<endl;
    > while (1);
    > return 0;
    > }
    //---------------------------------------------------------



  • Hier:
    http://www.cplusplus.com/reference/clibrary/cctype/toupper/

    Steht sogar ein Beispiel dabei, was genau dein problem lösen sollte.
    Dass es eine bessere Variante gibt kann natürlich trotzdem sein.



  • toupper funktioniert mit der richtigen locale . Beispiel:

    #include <iostream>
    #include <string>
    #include <locale>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
    	locale::global(locale("GERMAN"));
    	string s = "ÄÖÜäöüß";
    	transform(s.begin(), s.end(), s.begin(), &toupper);
    	cout << s << endl;
    }
    

    Ausgabe:

    ÄÖÜÄÖÜß
    


  • Mr.Mojo schrieb:

    Eine mögliche Lösung ist ja die Buchstaben einzeln mit der Funktion toupper() in Großbuchstaben umzuwandeln, aber ich suche eine bessere Funktion, die auch Umlaute usw umwandelt.

    Vielleicht to_upper() aus Boost.StringAlgorithms, falls du Boost benutzt. Da gibts auch sonst einige interessante Dinge. 😉

    ipsec schrieb:

    toupper funktioniert mit der richtigen locale .

    Einfacher wäre es doch, die Funktion std::toupper() aus <locale> zu verwenden, welche das Locale als Parameter nimmt...



  • Nexus schrieb:

    ipsec schrieb:

    toupper funktioniert mit der richtigen locale .

    Einfacher wäre es doch, die Funktion std::toupper() aus <locale> zu verwenden, welche das Locale als Parameter nimmt...

    Dann kann man aber nicht so einfach transform verwenden 😉



  • ipsec schrieb:

    Dann kann man aber nicht so einfach transform verwenden 😉

    Das stimmt. Aber wenn man die Funktionalität mehrfach verwendet, ist std::transform() sowieso hässlich. Und wenn man eine eigene Funktion void to_upper(std::string&) hat, kann man eine einfache Schleife verwenden.

    Oder, wenn einem Schleifen zu trivial sind:

    void to_upper(char& c)
    {
        c = std::toupper(c, std::locale());
    }
    
    std::for_each(s.begin(), s.end(), &to_upper);
    

    Oder noch lustiger: 🤡

    std::transform(s.begin(), s.end(), s.begin(), std::tr1::bind(&std::toupper, _1, std::locale()));
    

    Aber eben: Wenn man Boost hat, ist das wohl das Einfachste. Und sonst würde ich eine altmodische Schleife in eine Funktion packen.



  • ipsec schrieb:

    Nexus schrieb:

    ipsec schrieb:

    toupper funktioniert mit der richtigen locale .

    Einfacher wäre es doch, die Funktion std::toupper() aus <locale> zu verwenden, welche das Locale als Parameter nimmt...

    Dann kann man aber nicht so einfach transform verwenden 😉

    wenn boost.bind einfach ist, ist auch das einfach

    #include <iostream>
    #include <string>
    #include <locale>
    #include <algorithm> // transform
    #include <boost/bind.hpp>
    
    int main()
    {
        using namespace std;
        string s = "ÄÖÜäöüß";
        transform( s.begin(), s.end(), s.begin(), boost::bind( &toupper< char >, _1, locale( "german" ) ) );
        cout << s << endl;
        return 0;
    }
    

    Gruß
    Werner



  • Okay, danke für die schnelle Antwort, für meine Anwendung ist die Lösung von ipsec optimal, daher riesen Dank an alle!



  • aber eine Frage hab ich doch noch 😉

    Wenn ich das Programm so umwandle, funktioniert die Umwandlung der Umlaute nicht mehr, ich verstehe aber nicht wieso!

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <locale>
    #include <algorithm>

    using namespace std;

    int main()
    {
    string s;
    locale::global(locale("GERMAN"));
    cout<<"Bitte einen String eingeben: "<<endl;;
    cin>>s;
    transform(s.begin(), s.end(), s.begin(), &toupper);
    cout << s << endl;
    while(1);

    }



  • Zeig mal deine toupper-Funktion bitte 🙂



  • mhm muss ich da die vom 1.Post einbinden, oder wie meinst du das? Aber wenn ich die Funktion von ipsec ausführe funktioniert es ja einwandfrei, aber wenn ich das Programm umforme ( mit eingabe etc.) geht es nicht mehr.



  • Ignorier meinen letzten Post, der war dumm. Das Problem ist das die Konsole keine Umlaute darstellen kann. Wenn, dann müsstest du das irgendwie pfuschen...



  • Also die Konsole kann schon Umlaute ausgeben, weil es ja bei ipsec's Programm einwandfrei funktioniert!



  • Der Fehler liegt nicht in der Ausgabe, sondern in der Eingabe (man schaue sich den String im Debugger nach dem Einlesen an). Ich weiß jetzt aber leider auch keine Lösung.



  • Was ist denn "GERMAN" für ein Locale? Ist das überhaupt gültig? 😮



  • Wenns der Compiler unterstützt... Die Zeichenketten sind vom Standard nicht vorgegeben.


Anmelden zum Antworten