String groß/klein schreiben
-
danke!!
-
CStoll schrieb:
zeichenweise tolower() bzw. toupper() anwenden. Oder automatisiert:
transform_copy(s.begin(),s.end(),ostream_iterator<char>(cout),tolower);Hat das nicht den klassiches signed/unsigned char Bug? tolower/toupper aus cctype darf nur unsigned chars bekommen. Trudeln dort anderenfalls Zeichen < 0 ein, gibt das bestenfalls eine Debug Assertion.
Außerdem sollte es doch einfach transform sein, oder? transform_copy gibbet net.
-
jetzt ist mir unklar was stimmt und was nicht?

-
Der Code von CStoll hat undefiniertes Verhalten.
-
If the argument to the tolower() function is an upper-case letter, the corresponding lower-case letter is returned if there is one; otherwise the argument is returned unchanged.
Und mir ist kein Fall bekannt, bei dem ein Groß/Klein-Buchstabe im negativen Bereich liegt.
(PS: OK, transform() wäre richtig)
-
Es ist im Standard nicht definiert das 'char' == 'unsigned char'. Wenn 'char' == 'signed char' ist dann gibt es Probleme.
-
transform( s.begin(), s.end(), ostream_iterator<char>( cout), MyTolower); ... char MyTolower( char c) { return tolower( static_cast<unsigned char>( c)); }Sollte es tun.
tolower bekommt int's und keine chars. Die chars müssen aber in unsigned Repräsentation reinkommen. Manche manpages verschweigen das. Für Zeichen >127 (z.B. deutsche Umlaute) trifft genau dieses Problem zu. Und da char auf vielen Plattformen signed ist, hat man dann den Salat.
Sinn und Zweck mit den ints ist, dass auch EOF an die Funktion übergeben werden kann, dass ja per se nicht in char darstellbar sein darf.
Nachtrag:
http://www.calpoly.edu/cgi-bin/man-cgi?tolower+3
toupper() and tolower() have as domain the range of getc(3S): the integers from -1 through 255.Manche Implementationen reagieren auf eine Verletzung des Wertebereichs sehr empfindlich mit einer Assertion.
-
wieo sollte denn das Vorzeichen einen Einfluß darauf haben, ob ein Zeichen nun Groß- oder Kleinbuchstabe ist?
(btw, tolower arbeitet auf int's)
-
Du postest zu schnell :p Schau mal auf meinen Nachtrag

-
Ist eigentlich auch
char MyTolower(unsigned char c) { return tolower(c); }in Ordnung?
-
Sollte nicht gehen, da implizite Konvertierungen von char nach signed oder unsigned nicht erlaubt sind. (immer explizite cast-Syntax)
Edit: Hmm kompiliert bei mir auch, sogar mit --pedantic . Will Irrtum meinerseits mal nicht ausschließen

-
Na ja compilieren tut es im Zusammenhang mit std::transform. Aber könnte sein das es auf Compiler wo char, signed char entspricht nicht compiliert.
-
Hallo,
mal von der signed/unsigned-Problematik (die ich hier im Forum schon mindestens elftausendmal angesprochen habe) abgesehen, hat der Aufruf vontransform(s.begin(),s.end(),ostream_iterator<char>(cout),tolower);noch ein anderes Problem. tolower ist im Namensraum std mehrdeutig (abhängig von den gerade inkludierten Headern). Der letzte Template-Parameter von transform kann also nicht immer eindeutig deduziert werden.
Man sollte also stets die von 7H3 N4C3R vorgeschlagene Variante verwenden.
-
Man sollte stets eine for-schleife verwenden.

-
Da du gerade anwesend bist, Hume:

Wie sieht das jetzt aus mit der impliziten Konvertierung von char nach signed oder unsigned char? Gerade hat's bei mir kompiliert, genauso kann ich mich aber auch dran erinnern, dass mir sowas schon um die Ohren geflogen ist. Eine Sektion im Standard, die eine klare Aussage dazu trifft, konnte ich bis jetzt auch noch nicht finden.
-
Hallo,
ich sehe nichts das gegen eine implizite Konvertierung zwischen signed char und unsigned char spricht. So wie ich das sehe sind die folgenden Umwandlungen äquivalent.typedef unsigned char uchar; signed char c = ...; unsigned char d = c; unsigned char e = uchar(c); unsigned char f = static_cast<unsigned char>(c);d
Ein Tolower mit einem unsigned char Parameter sollte für alle chars ok sein (signed und unsigned).
Nur mit dem int-Parameter muss man halt aufpassen, da man hier signed chars zuerst nach unsigned casten muss. Ansonsten erhält man potentiell illegale Werte.
-
Jetzt fällt's mir auch gerade wieder ein, wo ich die Probleme hatte. char* vs. unsigned char*. Das hat ja aber mit den chars selbst nix zu tun und die Gründe sind mir auch völlig klar. Trotzdem danke

-
Bin gerade etwas verwirrt über die funktion die da gebaut wird. Was muss ich denn nun schreiben, damit ich (ohne Probleme) einen String in einen anderen umwandeln kann. Was hat das mit dem cout dort eigentlich zu suchen.
Und weil die Frage kam (in diesem Thread oder in einem anderen. weiß nicht mehr) wieso man überhaupt sowas brauch:
Ich möchte verschiedene Dateiendungen abprüfen, und habe keine Lust alle möglichen Permutationen der GroßKleinSchreibung abzuprüfen. Deshalb wird alles auf groß gemacht und fertig.

-
Siehe letzten Beitrag von 7H3 N4C3R auf Seite 1.