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 s1ini 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.0pakai di Manjaro.
Juga, ketika saya mengkompilasi dengan -fno-builtinbendera yang saya dapatkan sebagai gantinya:
-30
2
2
2
Saya kira itu karena program tidak menggunakan fungsi gcc yang dioptimalkan, tetapi pertanyaannya tetap.
strcasecmpAnda maksud tidak akurat. Detail lebih lanjut dalam jawaban yang dipilih.
A < _ && a > _ && A == aakan 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 charnilai 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.