http://www.pronix.de -> Forum -> C-Programmieren -> Code-Schnipsel

Unterseiten

Code-Schnipsel

Moderatoren: broesel, Martin Conrad, Patrick

Thema: String in Gross- oder Kleinbuchstaben umwandeln

  • (nur registrierte Mitglieder)
Hi!

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

 
Hallo,

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 (externer link) - bitte Fragen einreichen :)

 
  • (nur registrierte Mitglieder)