strcasecmp
C fonksiyonu yeniden uygulamaya çalışıyorum ve karşılaştırma sürecinde bir tutarsızlık gibi görünüyor fark ettim.
itibaren man strcmp
Strcmp () işlevi, iki s1 ve s2 dizesini karşılaştırır. Yerel ayar dikkate alınmaz (yerel ayarlara duyarlı bir karşılaştırma için bkz. Strcoll (3)). Eğer s1 sırasıyla, eşleşecek, eşleşecek veya s2'den büyük olacaksa, sıfırdan küçük, ona eşit veya sıfırdan büyük bir tamsayı döndürür.
itibaren man strcasecmp
Strcasecmp () işlevi, karakterlerin durumunu göz ardı ederek s1 ve s2 dizelerinin bayt bayt karşılaştırmasını gerçekleştirir. Eğer s1 sırasıyla, eşleşecek, eşleşecek veya s2'den büyük olacaksa, sıfırdan küçük, ona eşit veya sıfırdan büyük bir tamsayı döndürür.
int strcmp(const char *s1, const char *s2);
int strcasecmp(const char *s1, const char *s2);
Verilen bu bilgi, aşağıdaki kodun sonucunu anlamıyorum:
#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;
}
Çıkışı:
-1 # "A" is less than "_"
1 # "a" is more than "_"
2 # "A" is more than "_" with strcasecmp ???
2 # "a" is more than "_" with strcasecmp
Geçerli karakter s1
bir harfse, geçerli karakterin s2
bir harf olup olmadığına bakılmaksızın her zaman küçük harfe dönüştürülür .
Birisi bu davranışı açıklayabilir mi? Birinci ve üçüncü satırlar aynı olmamalı mı?
Şimdiden teşekkür ederim!
PS: Manjaro
kullanıyorum gcc 9.2.0
.
Ayrıca, ben -fno-builtin
bayrağı ile derlemek yerine:
-30
2
2
2
Sanırım bunun nedeni programın gcc'nin optimize edilmiş fonksiyonlarını kullanmaması, ancak soru kalmasıdır.
strcasecmp
Bahsettiğiniz açıklama doğru değil. Yükseltilmiş cevaplarda daha fazla ayrıntı.
A < _ && a > _ && A == a
çok fazla soruna neden olur.
unsigned char
. C17 / 18 "Dize kullanımı <string.h>" -> "Bu alt maddedeki tüm fonksiyonlar için, her karakter sanki türünde olarak yorumlanmalıdır unsigned char
". char
Değerler ASCII 0-127 aralığının dışında olduğunda fark yaratır .
printf("%i\n", strcasecmp("a", "_"));
Bu muhtemelen aynı sonucu olmalıdırprintf("%i\n", strcasecmp("A", "_"));
Ama bu demek istediğini bir bu iki harf duyarsız aramaların onun küçük harfe duyarlı meslektaşı katılmıyorum gidiyor.