Ich versuche, die strcasecmp
Funktion 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 s1
ein Buchstabe ist, wird es anscheinend immer in Kleinbuchstaben umgewandelt, unabhängig davon, ob das aktuelle Zeichen in s2
ein 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.0
auf Manjaro.
Wenn ich mit dem -fno-builtin
Flag 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.
strcasecmp
Sie sich beziehen, nicht korrekt ist. Weitere Details in den positiv bewerteten Antworten.
A < _ && a > _ && A == a
wü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 char
Werte 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.