Sto cercando di reimplementare la strcasecmp
funzione in C e ho notato ciò che sembra essere un'incoerenza nel processo di confronto.
A partire dal man strcmp
La funzione strcmp () confronta le due stringhe s1 e s2. Le impostazioni internazionali non vengono prese in considerazione (per un confronto consapevole delle impostazioni locali, vedere strcoll (3)). Restituisce un numero intero minore di, uguale a, o maggiore di zero se si trova, rispettivamente, che s1 è minore di, corrispondente o maggiore di s2.
A partire dal man strcasecmp
La funzione strcasecmp () esegue un confronto byte per byte delle stringhe s1 e s2, ignorando il caso dei caratteri. Restituisce un numero intero minore di, uguale a, o maggiore di zero se si trova, rispettivamente, che s1 è minore di, corrispondente o maggiore di s2.
int strcmp(const char *s1, const char *s2);
int strcasecmp(const char *s1, const char *s2);
Dato, queste informazioni, non capisco il risultato del seguente codice:
#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;
}
ouput:
-1 # "A" is less than "_"
1 # "a" is more than "_"
2 # "A" is more than "_" with strcasecmp ???
2 # "a" is more than "_" with strcasecmp
Sembra che, se il carattere corrente in s1
è una lettera, viene sempre convertito in minuscolo, indipendentemente dal fatto che il carattere corrente s2
sia una lettera o meno.
Qualcuno può spiegare questo comportamento? La prima e la terza riga non dovrebbero essere identiche?
Grazie in anticipo!
PS:
sto usando gcc 9.2.0
Manjaro.
Inoltre, quando compilo con la -fno-builtin
bandiera ottengo invece:
-30
2
2
2
Immagino sia perché il programma non utilizza le funzioni ottimizzate di gcc, ma la domanda rimane.
strcasecmp
cui ti riferisci non sia accurata. Maggiori dettagli nelle risposte votate.
A < _ && a > _ && A == a
causerebbe così tanti problemi.
unsigned char
. C17 / 18 "Gestione delle stringhe <string.h>" -> "Per tutte le funzioni di questo sottoclauso, ogni carattere deve essere interpretato come se avesse il tipo unsigned char
". Questo fa la differenza quando i char
valori sono al di fuori dell'intervallo ASCII 0-127.
printf("%i\n", strcasecmp("a", "_"));
questo dovrebbe presumibilmente avere lo stesso risultato diprintf("%i\n", strcasecmp("A", "_"));
Ma ciò significa che una di queste due chiamate senza distinzione tra maiuscole e minuscole non sarà d'accordo con la sua controparte sensibile al maiuscolo / minuscolo.