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