Kleinbuchstaben ---> Großbuchstaben



  • Hallo liebe C++ Community!

    Ich bin ziehmlich neu auf dem Gebiet und stehen nun vor vollgendem Problem:

    Ein Text soll in Großbuchstaben umgewandtelt werden. Hier ein kleines Beispiel:

    Hans kaufte sich 15 Teller. ---> HANS KAUFTE SICH 15 TELLER.

    Hab grad mal das rausgefunden 😞 :

    t = T --> txt[i] = txt[i] - 32; // Geht für jeden kleinen Buchstaben

    Aber wie kann ich auf Sonderzeichen und Zahlen abfragen lassen?

    Ich komm einfach nicht drauf wie das gehen soll...

    Bin für jeden Vorschlag dankbar.

    Heinke



  • Du könntest z.B. eine Funktion schreiben 'char kleingross(char c)'

    Da fragst du dann ab:
    Wenn c >= 'a' und c <= 'z' die Sache mit den -32.
    Wenn (c=='ö') return 'Ö'
    etc.
    sonst return c.

    Und die rufst du dann für jeden Buchstaben auf.



  • tolower / toupper



  • Habs soweit

    //---------------------------------------------------------------------------
    String kleingross (String txt)
    {
     for (int i=1;i<=txt.Length();i++)
     {
      if (txt[i] >= 'a' && txt[i] <= 'z')
       if (txt[i] == 'ö')
        txt[i] = 'Ö';
         else
          txt[i] = txt[i] - 32;
    
     }
     return txt;
    }
    //---------------------------------------------------------------------------
    

    Aber das mit Ö geht irgendwie nicht



  • ö liegt im Assci Code ja auch nicht zwischen a und z.
    Das musst extra abfragen, nicht als Untermenge der >=a <=z Bedingung.



  • Besser so?

    //---------------------------------------------------------------------------
    String kleingross (String txt)
    {
     for (int i=1;i<=txt.Length();i++)
     {
      if (txt[i] >= 'a' && txt[i] <= 'z')
       txt[i] = txt[i] - 32;
      else
       switch (txt[i])
       {
        case 'ö': txt[i] = 'Ö'; break;
        case 'ä': txt[i] = 'Ä'; break;
        case 'ü': txt[i] = 'Ü'; break;
       }
     }
     return txt;
    }
    //---------------------------------------------------------------------------
    


  • Jetzt musst du nur noch dafür sorgen, dass ß auf SS abgebildet wird.



  • Ach ich denk mal, das dürfte kein Problem darstellen 😉

    Danke euch allen für eure freundliche Unterstützung!



  • Heinke schrieb:

    Ach ich denk mal, das dürfte kein Problem darstellen 😉

    Danke euch allen für eure freundliche Unterstützung!

    Das Problem dabei ist, dass der String um ein Zeichen länger wird.



  • Also ich hätte es ja so gemacht, ist doch einfacher (?!):

    /**
     * Wandelt uebergebenen String in Upper-String um.
     */
    string CStringHelper::ToUpper( string inputStr )
    {
    	transform (inputStr.begin(),inputStr.end(), inputStr.begin(), toupper);
    
    	return inputStr;
    }
    
    /**
     * Wandelt uebergebenen String in Lower-String um.
     */
    string CStringHelper::ToLower( string inputStr )
    {
    	transform (inputStr.begin(),inputStr.end(), inputStr.begin(), tolower);
    
    	return inputStr;
    }
    

    Gruß
    daniel



  • DanielG schrieb:

    Also ich hätte es ja so gemacht, ist doch einfacher (?!):

    ...

    Im Prinzip ja - allerdings wird das signed/unsigned-Problem vernachlässigt. Vor dem Aufruf von toupper/tolower und Konsorten (isspace etc...) muss der char nach unsigned konvertiert werden, weil man sonst den vorgegebenen Wertebereich (-1 - 255) verletzen kann.



  • Hallo,
    desweiteren sind tolower und toupper überladenene Namen in std. Man sollte also statt:

    std::transform(inputStr.begin(),inputStr.end(), inputStr.begin(), toupper);
    

    besser schreiben:

    std::transform(inputStr.begin(),inputStr.end(), inputStr.begin(), static_cast<int (*)(int)>(toupper));
    

    Das wäre dann zumindest portabel. Wenn nicht die signed/unsigned-Problematik bestünde, auf die 7H3 N4C3R hingewiesen hat, die solche Aufrufe verbietet.



  • Mit diesen ganzen tolower und toupper kann ich nichts anfangen.

    OK, jetzt hab ich noch ein Problem:

    //---------------------------------------------------------------------------
    String kleingross (String txt)
    {
     for (int i=1;i<=txt.Length();i++)
     {
      if (txt[i] >= 'a' && txt[i] <= 'z')
       txt[i] = txt[i] - 32;
      else
       switch (txt[i])
       {
        case 'ö': txt[i] = 'Ö'; break;
        case 'ä': txt[i] = 'Ä'; break;
        case 'ü': txt[i] = 'Ü'; break;
       }
     }
     return txt;
    }
    //---------------------------------------------------------------------------
    

    Es muss doch eine Möglichkeit geben nach dem ä ö ü abzufragen, ohne ein switch zu nehmen, ähnlich wie bei den Buchstaben a - z. Irgenwie komm ich nicht drauf...bin halt noch ziehmlich neu auf dem Gebiet 😉



  • Da die Umlaute nicht hintereinander im ASCII-Code stehen, wird das über <= und >= nicht funktionieren. Aber versuch's mal so:

    std::string luml="äöü",uuml="ÄÖÜ";
    int upos;
    if((upos=luml.find(txt[i])!=std::string::npos) txt[i]=uuml[upos];
    

    (wenn c in den kleinen Umlauten vorkommt, ersetze es durch den entsprechenden großen Umlaut)

    PS: Statt toupper etc. zwanghaft nachprogrammieren zu wollen, solltest du es lieber verwenden lernen 😉



  • Hallo

    da Heinke expliziet String mit großem S schreibt, vermute ich mal er benutzt den Builder mit den VCL-AnsiStrings.
    Dort must du aber bloß schreiben :

    String Test = "Das ist ein Test";
    String Test2 = Test.Uppercase();
    

    bis bald
    akari


Anmelden zum Antworten