Я пытаюсь переопределить функцию strcasecmp
в C, и я заметил несоответствие в процессе сравнения.
С man strcmp
Функция strcmp () сравнивает две строки s1 и s2. Локаль не учитывается (сравнение с учетом локали смотрите в strcoll (3)). Он возвращает целое число меньше, равно или больше нуля, если найдено s1, соответственно, меньше, для соответствия или больше s2.
С man strcasecmp
Функция strcasecmp () выполняет побитовое сравнение строк s1 и s2, игнорируя регистр символов. Он возвращает целое число меньше, равно или больше нуля, если найдено s1, соответственно, меньше, для соответствия или больше s2.
int strcmp(const char *s1, const char *s2);
int strcasecmp(const char *s1, const char *s2);
Учитывая эту информацию, я не понимаю результат следующего кода:
#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
Похоже, что если текущий символ в s1
является буквой, он всегда преобразуется в нижний регистр, независимо от того, является ли текущий символ в s2
буквой или нет.
Может кто-нибудь объяснить такое поведение? Разве первая и третья строки не должны совпадать?
Заранее спасибо!
PS:
Я использую gcc 9.2.0
на Манджаро.
Кроме того, когда я компилирую с флагом -fno-builtin
, который я получаю вместо:
-30
2
2
2
Я думаю, это потому, что программа не использует оптимизированные функции g cc, но вопрос остается.