Code-Schnipsel
Moderatoren: broesel, Martin Conrad, PatrickThema: String in Gross- oder Kleinbuchstaben umwandeln
Re: String in Gross- oder Kleinbuchstaben umwandeln
icefire am 19.10.2009 um 21:38
Die Zeile
*(p+i) = (*(s+i)>96 && *(s+i)<123) ? *(s+i)-32 : *(s+i);
ist IMHO nicht gerade leserlich.
Vorschlag:
while ( *s )
{
// Check if current character is lower case
if
(
( *s > 96 ) &&
( *s < 123 )
)
{
*p = *s-32; // Convert if lower case
}
else
{
*p = *s; // Leave otherwise
}
// Move to the next character
s++;
p++
}
mfg, Wolfgang
--
Hex, Bugs and Rock 'n Roll
Re: String in Gross- oder Kleinbuchstaben umwandeln
broesel (webmaster) am 17.11.2009 um 00:35
ihr geht schändlicherweise davon aus, dass der verwendete Zeichensatz immer 7-Bit ASCII ist, daher hier ein paar Bemerkungen:
- nicht jeder Buchstabe kommt im ASCII vor (z.B. das chinesische Alphabet)
- nicht jeder Großbuchstabe ist im verwendeten Zeichensatz 32 Stellen von seinem entsprechenden Kleinbuchstaben entfernt
- nicht jeder Großbuchstabe hat überhaupt einen entsprechenden Kleinbuchstaben und umgekehrt (Beispiel: das deutsche 'ß')
Glücklicherweise wussten das auch schon die Leute, die den C-Standard entworfen haben. Daraus ein Zitat:
Zitat:
The toupper function converts a lowercase letter to a corresponding uppercase letter.
If the argument is a character for which islower is true and there are one or more corresponding characters, as specified by the current locale, for which isupper is true, the toupper function returns one of the corresponding characters (always the same one for any given locale); otherwise, the argument is returned unchanged.
Mit anderen Worten: toupper(c) konvertiert einen Kleinbuchstaben in einen eindeutigen Großbuchstaben genau dann, wenn c ein Kleinbuchstabe ist und es einen entsprechenden Großbuchstaben gibt. Analoges gilt für tolower().
Hier also mein Vorschlag für eine programmatische Umsetzung:
char *uc(char *str)
{
size_t i, len = strlen(str);
for(i = 0; i < len; i++)
str[i] = toupper(str[i]);
return str;
}
char *lc(char *str)
{
size_t i, len = strlen(str);
for(i = 0; i < len; i++)
str[i] = tolower(str[i]);
return str;
}
Es werden keine Annahmen über den verwendeten Zeichensatz gemacht, sämtliche im Thread vorgeschlagenen Überprüfungen werden weitaus vollständiger und insbesondere locale-dependant von toupper()/tolower() übernommen, der Code ist besser lesbar weil kürzer, und wie ich glaube maximal portabel.
Gruss,
Philip
--
The C Programming Quiz
- bitte Fragen einreichen :)
