Großbuchstaben in Kleine umwandeln
-
Gibt es eine Möglichkeit Großbuchstaben in Kleine umzuwandeln und umgekehrt?
-
http://www.cppreference.com/stdstring/tolower.html
http://www.cppreference.com/stdstring/toupper.html
-
Nabend,
um Grossbuchstaben in Kleinbuchstaben umzuwandeln:
struct ToupperHelper { char operator()(char c) const { return toupper(static_cast<unsigned char>(c)); } }; //irgendwo im quelltext gibt es ein string s("foobar"); oder so transform(s.begin(), s.end(), s.begin(), ToupperHelper());Analog ist es mit tolower zu machen.
mfg
v R
-
Da kann man auch gleich den Function->Functor Adapter der STL nehmen... [den brauch ich nie, hab den Namen nicht im Kopf, glaube ptr_fun]
Gruß
-
FireFlow schrieb:
Da kann man auch gleich den Function->Functor Adapter der STL nehmen... [den brauch ich nie, hab den Namen nicht im Kopf, glaube ptr_fun]
Ja, das dürfte der richtige sein - aber gerüchten zufolge arbeitet transform sogar direkt mit Funktionspointern zusammen (->"transform(st,en,toupper);" reicht völlig).
Diese Adapter werden erst benötigt, wenn du irgendwo die STL-Funktor-typedefs (return_type, argument_type,...) benötigst, z.B. beim Zusammenspiel mit anderen Adapetern (negate, bind2nd).
-
struct ToupperHelper { char operator()(unsigned char c) const { return toupper(c); } }; //irgendwo im quelltext gibt es ein string s("foobar"); oder so transform(s.begin(), s.end(), s.begin(), ToupperHelper());
-
Bei mir kommt immer folgender Fehler:
'transform' : nichtdeklarierter Bezeichner
-
Xclear schrieb:
Bei mir kommt immer folgender Fehler:
'transform' : nichtdeklarierter Bezeichnerdu must <algorithm> einbinden. evtl. beherrscht dein compiler auch kein ADL - dann schreibst du einfach:
std::transform(s.begin(), s.end(), s.begin(), ToupperHelper());nat. ist ToupperHelper - wie bereits erwähnt - im grunde unnötig:
transform(s.begin(), s.end(), s.begin(), toupper);oder aber man könnte auch noch eine der case_conv functionen aus boost.string_algo verwenden.
/edit: genau genommen darf man sich ohnehin nicht auf ADL verlassen, denn std::string::iterator muss nicht in std:: definiert sein, oder könnte auch ein pointer sein (und hat dann keinen assoziierten namespace).
-
Danke ,hat geklappt
Aber noch eine Frage: Wie wandelt man eien großen Buchstaben in einen kleinen um?
Also bei mir ist das so, wenn ich einen kleinen Buchstaben durch transform laufen lasse wird er groß aber ein Großer bleibt einfach groß?!?
Ich möchte aber das auch große Buchsteben in Kleine umgewandelt werden, wie mach ich das?
-
camper: ToupperHelper oder etwas ähnliches ist nötig. Wegen der unsigned char-Sache.
-
Xclear schrieb:
Danke ,hat geklappt
Aber noch eine Frage: Wie wandelt man eien großen Buchstaben in einen kleinen um?
Also bei mir ist das so, wenn ich einen kleinen Buchstaben durch transform laufen lasse wird er groß aber ein Großer bleibt einfach groß?!?Ich möchte aber das auch große Buchsteben in Kleine umgewandelt werden, wie mach ich das?
Wie wäre es mit einer Simplen If-Abfrage a la:
if(der Buchstabe == GROßBUCHSTABE) der Buchstabe = kleinbuchstabe; else der Buchstabe = GROßBUCHSTABE;Funktionen die dir hierbei helfen sind toupper(), tolower(), isupper() und islower().
Nach dem Studium dieser Funktionen sollte es dir möglich sein z.B. das Folgende zu schreiben:
struct change_char { int operator()(int c) { return (isupper(c) ? tolower(c) : toupper(c)); } }; // Aufruf am besten im Zusammenhang mit transform().Gruß Caipi