J'essaie de réimplémenter la strcasecmp
fonction en C et j'ai remarqué ce qui semble être une incohérence dans le processus de comparaison.
De man strcmp
La fonction strcmp () compare les deux chaînes s1 et s2. Les paramètres régionaux ne sont pas pris en compte (pour une comparaison tenant compte des paramètres régionaux, voir strcoll (3)). Il retourne un entier inférieur, égal ou supérieur à zéro si s1 se révèle, respectivement, être inférieur à, correspondre ou être supérieur à s2.
De man strcasecmp
La fonction strcasecmp () effectue une comparaison octet par octet des chaînes s1 et s2, en ignorant la casse des caractères. Il retourne un entier inférieur, égal ou supérieur à zéro si s1 se révèle, respectivement, être inférieur à, correspondre ou être supérieur à s2.
int strcmp(const char *s1, const char *s2);
int strcasecmp(const char *s1, const char *s2);
Étant donné ces informations, je ne comprends pas le résultat du code suivant:
#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;
}
Sortie:
-1 # "A" is less than "_"
1 # "a" is more than "_"
2 # "A" is more than "_" with strcasecmp ???
2 # "a" is more than "_" with strcasecmp
Il semble que, si le caractère actuel dans s1
est une lettre, il est toujours converti en minuscules, que le caractère actuel dans s2
soit une lettre ou non.
Quelqu'un peut-il expliquer ce comportement? Les première et troisième lignes ne devraient-elles pas être identiques?
Merci d'avance!
PS:
J'utilise gcc 9.2.0
sur Manjaro.
De plus, lorsque je compile avec le -fno-builtin
drapeau, je reçois à la place:
-30
2
2
2
Je suppose que c'est parce que le programme n'utilise pas les fonctions optimisées de gcc, mais la question demeure.
strcasecmp
vous faites référence ne soit pas exacte. Plus de détails dans les réponses votées.
A < _ && a > _ && A == a
causerait tellement de problèmes.
unsigned char
. C17 / 18 "Gestion des chaînes <string.h>" -> "Pour toutes les fonctions du présent paragraphe, chaque caractère doit être interprété comme s'il avait le type unsigned char
". Cela fait une différence une fois que les char
valeurs sont en dehors de la plage ASCII 0-127.
printf("%i\n", strcasecmp("a", "_"));
cela devrait probablement avoir le même résultat queprintf("%i\n", strcasecmp("A", "_"));
Mais cela signifie que l' un de ces deux appels ne respectant pas la casse va être en désaccord avec son homologue sensible à la casse.