string Zeichenkette in Grossbuchstaben



  • Hallo!

    Unter Windows erhalte ich nur die Meldung "abnormal program termination" und unter Linux schlicht und einfach "Abgebrochen!". Das ist alles. Sonst keinerlei weitere Infos.

    Kein Anhaltspunkt zum suchen. Ich hab auch "using namespace std;" drin. Alles genauso, wie es lt. den Infos im Netz sein soll.



  • Hallo,

    so sollte es funktionieren:

    struct ToupperHelper {
        char operator()(char c) const {
            return toupper(static_cast<unsigned char>(c));
        }
    };
    
    transform(s.begin(), s.end(), s.begin(), ToupperHelper());
    

    mfg
    v R



  • Hier wird dein Problem beschrieben:
    http://www.devx.com/getHelpOn/Article/9702/1954?pf=true



  • So funzt es für mich:

    #include <algorithm>
    #include <cctype>
    #include <iostream>
    #include <string>
    
    int main() {
      std::string s = "Hello, World!";
    
      std::transform(s.begin(), s.end(), s.begin(), static_cast<int(*)(int)>(std::toupper)); //(int(*)(int)) <-- so hat man in C gecastet. Das hier ist C++.
      std::cout << s << std::endl;
    }
    


  • 0xdeadbeef schrieb:

    So funzt es für mich:

    So sagst du deinem Compiler er soll das Maul halten und den Code kompilieren. Als "funzen" würde ich undefiniertes Verhalten (falls dein char-Typ zufällig signed sein sollte) jetzt aber nicht unbedingt beschreiben wollen.

    Der Cast nach unsigned_char in v_Rs Posting steht da nicht zum Spaß oder weil C++ Casts gerade inn sind. Er ist tatsächlich nötig.



  • Das ist Schwachfug. toupper ist int(*)(int), und int ist implizit nach char konvertibel. Der Code ist standardkonform, und der Aufriss mit dem Funktor ist völlig unnötig.



  • 0xdeadbeef schrieb:

    Das ist Schwachfug. toupper ist int(*)(int), und int ist implizit nach char konvertibel. Der Code ist standardkonform, und der Aufriss mit dem Funktor ist völlig unnötig.

    Leg dich doch nicht mit HumeSikkins an...der wird wohl recht haben.



  • Ich frag mich gerade, warum immer wieder danach gefragt wird, wie man eine Zeichenkette in Großbuchstaben umwandelt.

    Einerseits frage ich mich jedesmal, wozu man das braucht. Gibt es eine sinnvolle Anwendung dafür, so dass dies so häufig gefragt wird?

    Andererseits ist eine solche Aufgabe ohne spezielle Bibliotheken nicht vernünftig hinzukriegen, es sei denn man beschränkt sich auf enge Spezialfälle. Bei der englischen Sprache oder bei case-insensitiven Programmiersprachen mit eingeschränktem Zeichensatz mag dies noch mit einfachen char Operationen gelingen, aber schon bei deutschen Sätzen scheitert dies:

    "Fußpflege ist wichtig" müsste zu "FUSSPFLEGE IST WICHTIG" werden.

    Für dies und kompliziertere Sprachen benötigt man Bibliotheken, die solche Fälle kennen, wie zum Beispiel die ICU von IBM. Mag sein, dass sich viele noch mit einfachen char Strings begnügen, aber i18n und l10n zu vernachlässigen, ist meiner Meinung nach verantwortungslos.



  • 0xdeadbeef schrieb:

    Das ist Schwachfug.

    Nö. Ganz und gar nicht. Falls char auf deiner Platform signed ist und dein String ein char enthält der Negativ ist (also ein Zeichen außerhalb des normalen 7-bit ASCII-Zeichensatzes), dann hat dein Code UB.

    toupper ist int(*)(int), und int ist implizit nach char konvertibel

    Was mit der ganzen Sache natürlich überhaupt nichts zu tun hat. Wichtig ist der Vertrag von toupper (wie er im C++ Standard definiert ist). Dor steht, dass toupper zwar ein int als Argument entgegennimmt, dessen Wert muss aber entweder EOF sein oder aber als unsigned char repräsentierbar sein. Die einzige Möglichkeit letztere Einschränkung zu erfüllen ist es den char explizit in ein unsigned char umzuwandeln.

    Der Code ist standardkonform und der Aufriss mit dem Funktor ist völlig unnötig.

    Nö. Mach dir einfach mal die Mühe in den Standard zu schauen, bevor du hier laut rumtrommelst. Wenn dir das zu anstrengend ist: eine Suche in comp.lang.c++.moderated hilft dir in diesem Fall auch weiter.



  • Dank euer Hilfe hab ich das Problem gelöst.
    Klappt einwandfrei!

    Besten Dank!


Anmelden zum Antworten