Umwandeln in unsigned char vor dem Aufrufen von Zeichenmanipulationsfunktionen
In C stellt sich die Frage, ob es notwendig ist, char-Argumente vorher in unsigned char umzuwandeln Aufrufen von Funktionen wie toupper() und tolower() aus dem
Einige Experten argumentieren, dass die Besetzung von entscheidender Bedeutung ist, um undefiniertes Verhalten zu verhindern. Gemäß dem C-Standard muss das an toupper() übergebene Argument als vorzeichenloses Zeichen oder gleich EOF darstellbar sein. Wenn das Argument einen anderen Wert hat, ist das Verhalten undefiniert.
Einfaches Zeichen kann entweder eine vorzeichenbehaftete oder eine vorzeichenlose Darstellung haben, und wenn es vorzeichenbehaftet ist, können negative Zeichenwerte bei der Übergabe an toupper() zu undefiniertem Verhalten führen. Dies liegt daran, dass toupper() ein int-Argument erwartet und die implizite Konvertierung eines negativ signierten Zeichens in int zu einem negativen Wert führt.
Zum Beispiel bei der Initialisierung:
string name = "Niels Stroustrup";
The Der Ausdruck toupper(name[0]) ist riskant, wenn einfaches Zeichen signiert wird, da name[0] negativ sein könnte. Um dies zu vermeiden, wird das Umwandeln in unsigned char empfohlen:
char c = name[0]; c = toupper((unsigned char)c);
Andere Experten behaupten, dass das Umwandeln unnötig ist. Sie weisen darauf hin, dass der C-Standard nichtnegative Werte für Mitglieder des Basiszeichensatzes garantiert. Daher besteht bei Zeichenfolgen, die mit gültigen Zeichen initialisiert wurden, kein Risiko undefinierten Verhaltens.
Bjarne Stroustrup selbst demonstriert in seinem Buch „The C Programming Language“ die Verwendung von toupper() ohne Casting. Er scheint anzunehmen, dass char unsigned ist, aber das ist nicht immer der Fall.
Im
Letztendlich hängt der richtige Ansatz von der Plattform und der Compiler-Implementierung ab. Im Zweifelsfall ist die Umwandlung in vorzeichenlose Zeichen eine sichere und konservative Vorgehensweise, um undefiniertes Verhalten beim Aufrufen von Zeichenmanipulationsfunktionen wie toupper() und tolower() zu vermeiden.
Das obige ist der detaillierte Inhalt vonSollten Sie „char' in „unsigned char' umwandeln, bevor Sie „toupper()' und „tolower()' in C verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!