Ich versuche, die strcasecmpFunktion in C erneut zu implementieren, und habe festgestellt, dass der Vergleichsprozess inkonsistent ist.
Von man strcmp
Die Funktion strcmp () vergleicht die beiden Zeichenfolgen s1 und s2. Das Gebietsschema wird nicht berücksichtigt (für einen Gebietsschema-fähigen Vergleich siehe strcoll (3)). Es gibt eine Ganzzahl zurück, die kleiner, gleich oder größer als Null ist, wenn festgestellt wird, dass s1 kleiner als, übereinstimmend oder größer als s2 ist.
Von man strcasecmp
Die Funktion strcasecmp () führt einen byteweisen Vergleich der Zeichenfolgen s1 und s2 durch, wobei die Groß- und Kleinschreibung der Zeichen ignoriert wird. Es gibt eine Ganzzahl zurück, die kleiner, gleich oder größer als Null ist, wenn festgestellt wird, dass s1 kleiner als, übereinstimmend oder größer als s2 ist.
int strcmp(const char *s1, const char *s2);
int strcasecmp(const char *s1, const char *s2);
Angesichts dieser Informationen verstehe ich das Ergebnis des folgenden Codes nicht:
#include <stdio.h>
#include <string.h>
int main()
{
// ASCII values
// 'A' = 65
// '_' = 95
// 'a' = 97
printf("%i\n", strcmp("A", "_"));
printf("%i\n", strcmp("a", "_"));
printf("%i\n", strcasecmp("A", "_"));
printf("%i\n", strcasecmp("a", "_"));
return 0;
}
Ausgabe:
-1 # "A" is less than "_"
1 # "a" is more than "_"
2 # "A" is more than "_" with strcasecmp ???
2 # "a" is more than "_" with strcasecmp
Wenn das aktuelle Zeichen in s1ein Buchstabe ist, wird es anscheinend immer in Kleinbuchstaben umgewandelt, unabhängig davon, ob das aktuelle Zeichen in s2ein Buchstabe ist oder nicht.
Kann jemand dieses Verhalten erklären? Sollten die erste und dritte Zeile nicht identisch sein?
Vielen Dank im Voraus!
PS:
Ich benutze gcc 9.2.0auf Manjaro.
Wenn ich mit dem -fno-builtinFlag kompiliere, bekomme ich stattdessen:
-30
2
2
2
Ich denke, das liegt daran, dass das Programm die optimierten Funktionen von gcc nicht verwendet, aber die Frage bleibt.
strcasecmpSie sich beziehen, nicht korrekt ist. Weitere Details in den positiv bewerteten Antworten.
A < _ && a > _ && A == awürde so viele Probleme verursachen.
unsigned char. C17 / 18 "String-Behandlung <string.h>" -> "Für alle Funktionen in diesem Unterabschnitt ist jedes Zeichen so zu interpretieren, als hätte es den Typ unsigned char". Dies macht einen Unterschied, sobald die charWerte außerhalb des ASCII-Bereichs 0-127 liegen.
printf("%i\n", strcasecmp("a", "_"));Dies sollte vermutlich das gleiche Ergebnis haben wie.printf("%i\n", strcasecmp("A", "_"));Dies bedeutet jedoch, dass einer dieser beiden Anrufe , bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird, nicht mit dem Gegenstück übereinstimmt, bei dem zwischen Groß- und Kleinschreibung unterschieden wird.