2010-04-18 10 views
69

Was ist der beste/sauberste Weg, um eine gemischte Groß-/Kleinschreibung in Kleinbuchstaben in C zu konvertieren?c - konvertiert eine gemischte Groß-/Kleinschreibung in Kleinbuchstaben

+2

Geht es Ihnen nur um ASCII mit Buchstaben a-z? –

+0

ascii. Wie würde ich das berücksichtigen? Würde das Beispiel unten noch funktionieren? was passiert wenn mein char ein '#' ist und tolower() angerufen wird? – sepiroth

+1

Das wird funktionieren. Ich dachte mehr darüber nach, ob deine Saite Dinge wie é oder Ü enthält. –

Antwort

111

Es ist in der Standardbibliothek, und das ist der einfachste Weg, den ich sehe, um eine solche Funktion zu implementieren. Also, ja, einfach die Zeichenfolge durchlaufen und jedes Zeichen in Kleinbuchstaben konvertieren.

etwas trivial wie folgt aus:

for(int i = 0; str[i]; i++){ 
    str[i] = tolower(str[i]); 
} 

oder wenn Sie ein Liner bevorzugen, dann können Sie diese ein von JF Sebastian verwenden:

for (; *p; ++p) *p = tolower(*p); 
+26

'für (; * p; ++ p) * p = tolower (* p);' scheint mehr idiomatisch. – jfs

+13

@ J.F. da gehst du. Hängt davon ab, ob der Code unheimlich oder nett aussehen soll :) (sehr gut lesbar, sieht aber beängstigend aus) – Earlz

+0

Das gibt mir einen segfault wenn str ein 'char *' ist, aber nicht wenn str ein char Array ist. Haben Sie eine Erklärung dafür? –

2

Haben Sie nur mit ASCII-Strings zu tun, und haben keine Probleme mit der Ländereinstellung? Dann, ja, das wäre ein guter Weg, es zu tun.

+0

Was passiert, wenn tolower() auf einem nicht-ASCII-Zeichen aufgerufen wird? mögen '!' oder '#'. Ich testete es auf "#" und es schien in Ordnung zu sein. gilt das generell für alle ASCII-Zeichen, die keine Buchstaben a-z sind? – sepiroth

+1

@hatorade: 'tolower()' lässt das Argument unverändert, wenn es nicht in 'A' .. 'Z' liegt. – jfs

+1

! und # sind beide ASCII-Zeichen. Mark bezog sich auf andere Codierungen wie UTF8, wo man nicht davon ausgehen kann, dass es ein Byte pro Zeichen gibt (wie es diese Lösung tut) – hdgarrood

6

konvertieren Fall zu senken entspricht Bit steigen 0x60:

for(char *p = pstr;*p;++p) *p=*p>0x40&&*p<0x5b?*p|0x60:*p; 

(für lateinischen Zeichensatz natürlich)

+3

Um es etwas lesbarer zu machen, könntest du 'for (char * p = pstr; * p; ++ p) * p = * p> = 'A' && * p <= 'Z'? * P | 0x60: * p; ' –

+4

Diese Version ist eigentlich langsamer als glibc' tolower() '. 55,2 vs 44,15 auf meiner Maschine. – jfs

+0

ich kann mir das nicht vorstellen: tolower() beschäftigt sich mit chars; nur wenn es Makro ist –

1

Wenn wir als schlampig sein werden als tolower() zu verwenden, dies zu tun:

char blah[] = "blah blah Blah BLAH blAH\0"; int i=0; while(blah[i]|=' ', blah[++i]) {} 

Aber, na ja , es explodiert irgendwie, wenn du es mit Symbolen/Zahlen fütterst, und im Allgemeinen ist es böse. Gute Interviewfrage.

+5

Ja, das wird fold/spindle/mutile eine Vielzahl von Symbolen (in ASCII, jedes Symbol, Steuerzeichen oder Ziffer mit Bit 5 klar wird der gleiche Zeichencode mit Bit 5 gesetzt, usw.) so wirklich, ernst, don ' t es benutzen. –

+0

Dieser Beitrag wird auf [meta] diskutiert (http://meta.stackoverflow.com/questions/270402/is-ghetto-an-offensive-word). –

Verwandte Themen