Es gibt eine Möglichkeit, Großbuchstaben in Kleinbuchstaben umzuwandeln OHNE if-Tests durchzuführen und es ist ziemlich einfach. Die Funktion isupper() bzw. die Verwendung von clocale.h durch das Makro sollte die Probleme in Bezug auf Ihren Standort beheben, aber wenn nicht, können Sie die UtoL[] nach Herzenslust verändern.
Angesichts der Tatsache, dass C's Zeichen wirklich nur 8-Bit-Ints sind (ohne Berücksichtigung der breiten Zeichensätze für den Moment), können Sie ein 256-Byte-Array erstellen, das einen alternativen Zeichensatz enthält, und in der Konvertierungsfunktion die Zeichen in Ihrer Zeichenkette als Subscripts in das Konvertierungs-Array verwenden.
Anstelle einer 1-zu-1-Zuordnung geben Sie den Arrayelementen mit Großbuchstaben die BYTE int-Werte für die Kleinbuchstaben. Sie finden vielleicht islower() und isupper() hier nützlich.
![enter image description here]()
Der Code sieht wie folgt aus...
#include <clocale>
static char UtoL[256];
// ----------------------------------------------------------------------------
void InitUtoLMap() {
for (int i = 0; i < sizeof(UtoL); i++) {
if (isupper(i)) {
UtoL[i] = (char)(i + 32);
} else {
UtoL[i] = i;
}
}
}
// ----------------------------------------------------------------------------
char *LowerStr(char *szMyStr) {
char *p = szMyStr;
// do conversion in-place so as not to require a destination buffer
while (*p) { // szMyStr must be null-terminated
*p = UtoL[*p];
p++;
}
return szMyStr;
}
// ----------------------------------------------------------------------------
int main() {
time_t start;
char *Lowered, Upper[128];
InitUtoLMap();
strcpy(Upper, "Every GOOD boy does FINE!");
Lowered = LowerStr(Upper);
return 0;
}
Auf diese Weise können Sie gleichzeitig alle anderen Zeichen, die Sie ändern möchten, neu zuordnen.
Dieser Ansatz hat einen großen Vorteil, wenn er auf modernen Prozessoren ausgeführt wird: Es besteht keine Notwendigkeit, Verzweigungsvorhersagen zu machen, da es keine if-Tests mit Verzweigungen gibt. Dadurch wird die Verzweigungsvorhersagelogik der CPU für andere Schleifen eingespart und ein Abwürgen der Pipeline wird tendenziell verhindert.
Einige hier werden diesen Ansatz als den gleichen erkennen, der auch für die Umwandlung von EBCDIC in ASCII verwendet wird.