toupper funktion



  • Hallo,

    ich möchte einen "Array of Characters" der in Kleinbuchstaben eingegeben wurde, in Großbuchstaben umwandeln und das ergebnis in einer Variablen speichern. Dazu gibts die Methode "toupper". Der wandelt mir aber nur einzelne zeichen um. Wie sag ich dem das der auch strings umwandeln soll?

    folgendes beispiel (Auszug) funzt nämlich nicht.

    char rom[20];
    int laenge;
    char zeichen;
    int summe=0;
    string erg;        
    
    cout<<"Bitte roemische Zahl eingeben: ";
    cin >> rom;
    laenge = strlen(rom);
    erg =toupper(rom);
    

    Ich erhalte immer die Fehlermeldung: error C2664: 'toupper': Konvertierung des Parameters 1 von 'char [20]' in 'int' nicht möglich

    Wieso int??



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • toupper arbeitet nur auf Einzelzeichen (int deshalb, weil die ganzen char-Funktionen (isalpha() oder toupper()) auch mit EOF-Werten rechnen können). Zeichenketten mußt du schon in einer Schleife einzeln umwandeln - oder per Algorithmus:

    for(int i=0;i<laenge;++i)
      erg+=toupper(rom[i]);
    
    //oder:
    transform(rom,rom+laenge,back_inserter(erg),toupper);
    


  • oder

    erg = rom;
    use_facet<ctype<string::value_type> >(locale()).toupper(erg.begin(), erg.end());
    


  • Vielen Dank, ich werd's dann mal mit 'ner Schleife versuchen. Das Beispiel in der Hilfe, oder das was mein Vorgänger geschrieben hat, ist mir nämlich 3 Nummer zu hoch 😃



  • Braunstein schrieb:

    oder

    erg = rom;
    use_facet<ctype<string::value_type> >(locale()).toupper(erg.begin(), erg.end());
    

    Ich bräuchte sowas noch für VC6. Wie geht das mit der dort mitgelieferten STL?

    Dank im voraus!!!

    Jens



  • jencas schrieb:

    Braunstein schrieb:

    oder

    erg = rom;
    use_facet<ctype<string::value_type> >(locale()).toupper(erg.begin(), erg.end());
    

    Ich bräuchte sowas noch für VC6. Wie geht das mit der dort mitgelieferten STL?

    Beim VC 6 gibt es statt use_facet irgendwelche Makros. Schau einfach mal in der mitgelieferten Hilfe nach (Stichwort: use_facet).

    Aus dem Kopf (hab keinen VC 6 mehr) würde ich sowas vermuten:

    _USE(deinLocal, ctype<string::value_type> ).toupper(first, last);
    


  • Vielen Dank schon mal für Deine Hilfe. 33,333% Erfolg ;-), denn leider werden nur die ä's umgesetzt. Und tracen in die STL hat mich auch nicht wirklich weitergebracht.

    Hier mal mein Codeschnipsel:

    using namespace std;
    
    	locale loc("german_germany");
    	string str = "Alle Mädels haben immer öfter übermütige Anfälle";
    	_USE(loc, ctype<string::value_type>).toupper(str.begin(), str.end());
    

    Wobei ich mir nicht sicher bin, ob "german_germany" korrekt ist. Diese Info habe ich "ge-group-googlet" (groups.google.de in microsoft.public.de.*), also aus irgend einem uralten Usenet Beitrag.
    Wäre echt super, wenn mir da jemand weiterhelfen könnte.

    Ciao

    Jens



  • using namespace std;
    
    void strupper(std::string & s, std::locale const & loc /*= std::locale()*/)
    {
    #ifdef _MFC_VER
    	const ctype<TCHAR> & ct = _USE(loc, ctype<TCHAR>);
    #else
    	const ctype<char> & ct = use_facet<ctype<char> >(loc);
    #endif
    	for (std::string::iterator iter = s.begin(), end = s.end(); iter != end; ++iter)
    		*iter = ct.toupper(*iter);
    }
    

    funktioniert jetzt für VC6 und VC.NET 😃 , mal schauen, was Linux und Solaris dazu sagen. Ausserdem werde ich das ganze wohl noch durch ein basic_string Template ersetzen, dann sollte das auch z.B. für wide chars funktionieren.


Anmelden zum Antworten