Saya mencoba menerapkan kembali strcasecmp
fungsi dalam C dan saya perhatikan apa yang tampak sebagai inkonsistensi dalam proses perbandingan.
Dari man strcmp
Fungsi strcmp () membandingkan dua string s1 dan s2. Lokal tidak diperhitungkan (untuk perbandingan sadar-lokal, lihat strcoll (3)). Ini mengembalikan bilangan bulat kurang dari, sama dengan, atau lebih besar dari nol jika s1 ditemukan, masing-masing, lebih kecil dari, untuk mencocokkan, atau lebih besar dari s2.
Dari man strcasecmp
Fungsi strcasecmp () melakukan perbandingan byte-by-byte dari string s1 dan s2, mengabaikan case dari karakter. Ini mengembalikan bilangan bulat kurang dari, sama dengan, atau lebih besar dari nol jika s1 ditemukan, masing-masing, lebih kecil dari, untuk mencocokkan, atau lebih besar dari s2.
int strcmp(const char *s1, const char *s2);
int strcasecmp(const char *s1, const char *s2);
Mengingat, informasi ini, saya tidak mengerti hasil dari kode berikut:
#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
Tampaknya, jika karakter saat s1
ini dalam huruf, itu selalu dikonversi menjadi huruf kecil, terlepas dari apakah karakter saat ini dis2
ini dalam huruf atau tidak.
Adakah yang bisa menjelaskan perilaku ini? Bukankah seharusnya baris pertama dan ketiga identik?
Terima kasih sebelumnya!
PS:
Saya gcc 9.2.0
pakai di Manjaro.
Juga, ketika saya mengkompilasi dengan -fno-builtin
bendera yang saya dapatkan sebagai gantinya:
-30
2
2
2
Saya kira itu karena program tidak menggunakan fungsi gcc yang dioptimalkan, tetapi pertanyaannya tetap.
strcasecmp
Anda maksud tidak akurat. Detail lebih lanjut dalam jawaban yang dipilih.
A < _ && a > _ && A == a
akan menyebabkan banyak masalah.
unsigned char
. C17 / 18 "Penanganan string <string.h>" -> "Untuk semua fungsi dalam sub-ayat ini, setiap karakter harus ditafsirkan seolah-olah memiliki tipe unsigned char
". Ini membuat perbedaan begitu char
nilai berada di luar rentang ASCII 0-127.
printf("%i\n", strcasecmp("a", "_"));
Ini mungkin seharusnya memiliki hasil yang sama denganprintf("%i\n", strcasecmp("A", "_"));
Tapi itu berarti bahwa salah satu dari dua panggilan case-sensitive ini akan tidak setuju dengan rekannya yang case-sensitive.