Heim > Backend-Entwicklung > C++ > Sollte ich in „unsigned char' umwandeln, bevor ich „toupper()', „tolower()' usw. verwende?

Sollte ich in „unsigned char' umwandeln, bevor ich „toupper()', „tolower()' usw. verwende?

Linda Hamilton
Freigeben: 2024-12-26 19:15:12
Original
766 Leute haben es durchsucht

Should I Cast to `unsigned char` Before Using `toupper()`, `tolower()`, etc.?

Muss ich vor dem Aufruf von toupper(), tolower() usw. in ein Zeichen ohne Vorzeichen umwandeln?

Diese Frage ergibt sich aus dem Vorschlag, in ein Zeichen ohne Vorzeichen umzuwandeln char ist erforderlich, bevor Zeichenmanipulationsfunktionen wie std::toupper und std::tolower aufgerufen werden. Der Code von Bjarne Stroustrup scheint diese Funktionen jedoch ohne Umwandlung zu verwenden.

Char-Darstellung

Char, signiertes Zeichen und unsigniertes Zeichen sind unterschiedliche Typen in C . Char kann einen Bereich darstellen, der entweder einem vorzeichenbehafteten oder einem vorzeichenlosen Zeichen entspricht. In Systemen, in denen char signiert ist, hat der gesamte Zeichensatz nicht negative Werte.

toupper-Funktion

Gemäß dem C-Standard akzeptiert toupper ein int-Argument und gibt zurück ein int-Ergebnis. Der Eingabewert muss als vorzeichenloses Zeichen oder gleich EOF darstellbar sein. Wenn nicht, ist das Verhalten undefiniert.

Undefiniertes Verhalten

Wenn plain char signiert ist und der an toupper übergebene Wert negativ ist, tritt undefiniertes Verhalten auf. Dies liegt daran, dass die implizite Konvertierung in int einen negativen Wert ergibt.

Umwandlung in vorzeichenloses Zeichen

Durch die Umwandlung des char-Arguments in vorzeichenloses Zeichen wird sichergestellt, dass der Wert nicht negativ ist , um undefiniertes Verhalten zu vermeiden. Obwohl char und unsigned char die gleiche Größe haben, stellen sie unterschiedliche Wertebereiche dar.

Implementierung

Diese Funktionen werden normalerweise mithilfe von Nachschlagetabellen implementiert. Eine Indizierung über die Grenzen der Tabelle hinaus kann zu undefiniertem Verhalten führen. Die direkte Konvertierung in vorzeichenlose Zeichen vermeidet dieses Problem nicht, wenn das Ergebnis implizit zurück in einen negativen Wert konvertiert wird.

Ausnahme: EOF

Die Funktionen in muss EOF (-1) als Argument akzeptieren. Dieser Wert kann nicht als vorzeichenloses Zeichen dargestellt werden, es ist jedoch ein Toupper erforderlich, um ihn zu verarbeiten.

C-Modifikationen

Der C-Standard ändert nur bestimmte C-Standardbibliotheksfunktionen und Es wurden keine Anpassungen an den Funktionen vorgenommen .

Fazit

Um undefiniertes Verhalten zu vermeiden, ist es notwendig, das char-Argument in unsigned char umzuwandeln, bevor toupper, tolower oder ähnliches aufgerufen wird funktioniert, auch wenn char ein nicht negativ vorzeichenbehafteter Typ ist.

Das obige ist der detaillierte Inhalt vonSollte ich in „unsigned char' umwandeln, bevor ich „toupper()', „tolower()' usw. verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage