Wie schreibe ich eine Zeichenfolge in C klein?

Lesezeit: 5 Minuten

Benutzeravatar von Tony Stark
Tony Stark

Wie kann ich in C eine Zeichenfolge mit gemischten Groß- und Kleinbuchstaben in eine Zeichenfolge mit Kleinbuchstaben konvertieren?

  • 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

Benutzeravatar von Earlz
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

Benutzeravatar von Oleg Razgulyaev
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

Benutzeravatar von cscan
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 deklarieren p.`

    – NewbiZ

    8. März um 2:32

Eduardos Benutzeravatar
Eduardo

Wenn Sie Unicode-Unterstützung in der Kleinbuchstabenfunktion benötigen, lesen Sie diese Frage: Light C Unicode Library

Benutzeravatar von Ken S
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

Benutzeravatar von Mark Byers
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

1423480cookie-checkWie schreibe ich eine Zeichenfolge in C klein?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy