Wie kann ich in C eine Zeichenfolge mit gemischten Groß- und Kleinbuchstaben in eine Zeichenfolge mit Kleinbuchstaben konvertieren?
Wie schreibe ich eine Zeichenfolge in C klein?
Tony Stark
Earlz
Es ist in der Standardbibliothek enthalten, und das ist die einfachste Möglichkeit, eine solche Funktion zu implementieren. Also ja, durchlaufen Sie einfach die Zeichenfolge und konvertieren Sie jedes Zeichen in Kleinbuchstaben.
So etwas Triviales:
#include <ctype.h>
for(int i = 0; str[i]; i++){
str[i] = tolower(str[i]);
}
oder wenn Sie Einzeiler bevorzugen, können Sie diesen von JF Sebastian verwenden:
for ( ; *p; ++p) *p = tolower(*p);
-
for ( ; *p; ++p) *p = tolower(*p);
wirkt idiomatischer.– jfs
18. April 2010 um 9:58 Uhr
-
@JF da gehst du. Hängt davon ab, ob der Code beängstigend oder nett aussehen soll 🙂 (sehr gut lesbarer Einzeiler, aber er sieht beängstigend aus)
– Earlz
18. April 2010 um 10:05 Uhr
-
Dies gibt mir einen Segfault, wenn str a ist
char *
, aber nicht, wenn str ein char-Array ist. Hast du dafür eine Erklärung?– Elektrischer Kaffee
22. November 2016 um 22:07 Uhr
-
Ich glaube, der Einzeiler wird dazu führen, dass Sie Ihren Zeiger auf die Zeichenfolge verlieren.
– Ace.C
8. September 2017 um 19:55 Uhr
-
Ich glaube, dass ein Liner unsägliche Auswirkungen haben wird.
– NOP da ANRUF
25. März 2018 um 1:12 Uhr
Oleg Razgulyaev
In Kleinbuchstaben umzuwandeln entspricht dem Anstieg von Bit 0x60, wenn Sie sich auf ASCII beschränken:
for(char *p = pstr; *p; ++p)
*p = *p > 0x40 && *p < 0x5b ? *p | 0x60 : *p;
-
Um es etwas lesbarer zu machen, könnten Sie tun
for(char *p = pstr;*p;++p) *p=*p>='A'&&*p<='Z'?*p|0x60:*p;
– Grant Peters
18. April 2010 um 10:54 Uhr
-
Diese Version ist tatsächlich langsamer als die von glibc
tolower()
. 55,2 vs. 44,15 auf meiner Maschine.– jfs
18. April 2010 um 18:10 Uhr
-
das kann ich mir nicht vorstellen: tolower() beschäftigt sich mit chars; nur wenn es Makro ist
– Oleg Razgulyaev
18. April 2010 um 18:37 Uhr
-
@oraz: tolower() hat
int (*)(int)
Unterschrift. Hier ist der Code, der für Leistungsmessungen verwendet wird gist.github.com/370497– jfs
18. April 2010 um 19:32 Uhr
-
Die schnellste Version verwendet eine Nachschlagetabelle anstelle von Verzweigungen.
– Jo
8. Mai 2020 um 23:24 Uhr
scannen
Schleifen des Zeigers, um eine bessere Leistung zu erzielen:
#include <ctype.h>
char* toLower(char* s) {
for(char *p=s; *p; p++) *p=tolower(*p);
return s;
}
char* toUpper(char* s) {
for(char *p=s; *p; p++) *p=toupper(*p);
return s;
}
-
Nun, wenn Sie den Einzeiler-Weg gehen, dann
s
eine lokale Variable in Ihrer Funktion ist, können Sie sie direkt verwenden, anstatt sie zu deklarierenp
.`– NewbiZ
8. März um 2:32
Eduardo
Wenn Sie Unicode-Unterstützung in der Kleinbuchstabenfunktion benötigen, lesen Sie diese Frage: Light C Unicode Library
Ken S
Wenn wir so schlampig sein wollen tolower()
mach das:
char blah[] = "blah blah Blah BLAH blAH\0";
int i = 0;
while( blah[i] |=" ", blah[++i] ) {}
Aber, nun ja, es explodiert irgendwie, wenn man es mit einigen Symbolen/Zahlen füttert, und im Allgemeinen ist es böse. Gute Interviewfrage, aber.
-
Ja, dies wird eine Vielzahl von Symbolen falten/spindeln/verstümmeln (in ASCII wird jedes Symbol, Steuerzeichen oder jede Ziffer mit gelöschtem Bit 5 zum gleichen Zeichencode mit gesetztem Bit 5 usw.), also wirklich, im Ernst, nicht benutze es.
– Ken S
22. Mai 2013 um 21:26 Uhr
-
Dieser Beitrag wird auf Meta diskutiert.
– Patrick Hofmann
2. September 2014 um 8:31 Uhr
-
Können Sie näher darauf eingehen? Wenn ich über tolower() lese, erwähnen sie alle, dass sie nur mit Zeichen funktionieren, für die ein Kleinbuchstabe definiert ist. Von opengroup.org: „Wenn das Argument von tolower() einen Großbuchstaben darstellt und es einen entsprechenden Kleinbuchstaben gibt [CX] [Option Start] (wie durch Zeichentypinformationen in der Programmgebietsschemakategorie LC_CTYPE definiert), [Option End] das Ergebnis ist der entsprechende Kleinbuchstabe. Alle anderen Argumente in der Domäne werden unverändert zurückgegeben.” Wenn dies der Fall ist, wo schlägt tolower() fehl?
– 9a3eedi
21. März um 11:20 Uhr
Markus Byers
Beschäftigen Sie sich nur mit ASCII-Strings und haben keine Gebietsschema-Probleme? Dann ja, das wäre ein guter Weg, es zu tun.
-
Ja, dies wird eine Vielzahl von Symbolen falten/spindeln/verstümmeln (in ASCII wird jedes Symbol, Steuerzeichen oder jede Ziffer mit gelöschtem Bit 5 zum gleichen Zeichencode mit gesetztem Bit 5 usw.), also wirklich, im Ernst, nicht benutze es.
– Ken S
22. Mai 2013 um 21:26 Uhr
-
Dieser Beitrag wird auf Meta diskutiert.
– Patrick Hofmann
2. September 2014 um 8:31 Uhr
-
Können Sie näher darauf eingehen? Wenn ich über tolower() lese, erwähnen sie alle, dass sie nur mit Zeichen funktionieren, für die ein Kleinbuchstabe definiert ist. Von opengroup.org: „Wenn das Argument von tolower() einen Großbuchstaben darstellt und es einen entsprechenden Kleinbuchstaben gibt [CX] [Option Start] (wie durch Zeichentypinformationen in der Programmgebietsschemakategorie LC_CTYPE definiert), [Option End] das Ergebnis ist der entsprechende Kleinbuchstabe. Alle anderen Argumente in der Domäne werden unverändert zurückgegeben.” Wenn dies der Fall ist, wo schlägt tolower() fehl?
– 9a3eedi
21. März um 11:20 Uhr
Beschäftigen Sie sich nur mit ASCII mit nur Buchstaben az?
– Mark Byers
18. April 2010 um 9:52 Uhr
ASCII. wie würde ich das berücksichtigen? Würde das Beispiel unten noch funktionieren? Was passiert, wenn mein char ein ‘#’ ist und tolower() darauf aufgerufen wird?
– Tony Stark
18. April 2010 um 10:10 Uhr
Das wird funktionieren. Ich habe eher darüber nachgedacht, ob Ihre Zeichenfolge Dinge wie é oder Ü enthält.
– Mark Byers
18. April 2010 um 10:46 Uhr
Warum nicht einfach “strlwr” verwenden?
strlwr((char*)str);
Es geht einfach durch die Zeichenfolge und konvertiert sie selbst.– Larry
1. März 2018 um 23:49 Uhr
@Larry Es ist kein Standard.
– Mitte
28. Mai 2018 um 20:45 Uhr