ฉันกำลังพยายามปรับใช้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
กับ Manjaro
นอกจากนี้เมื่อฉันรวบรวมกับ-fno-builtin
ธงฉันได้รับแทน:
-30
2
2
2
ฉันเดาว่าเป็นเพราะโปรแกรมไม่ได้ใช้ฟังก์ชั่นที่ดีที่สุดของ gcc แต่คำถามยังคงอยู่
strcasecmp
คุณอ้างถึงไม่ถูกต้อง รายละเอียดเพิ่มเติมในคำตอบ upvoted
A < _ && a > _ && A == a
จะทำให้เกิดปัญหามากมาย
unsigned char
"ราวกับว่า" C17 / 18 "การจัดการสตริง <string.h>" -> "สำหรับฟังก์ชั่นทั้งหมดใน subclause นี้อักขระแต่ละตัวจะถูกตีความราวกับว่ามันมีประเภทunsigned char
" สิ่งนี้สร้างความแตกต่างเมื่อchar
ค่าอยู่นอกช่วง ASCII 0-127
printf("%i\n", strcasecmp("a", "_"));
สิ่งนี้น่าจะมีผลเช่นเดียวกับprintf("%i\n", strcasecmp("A", "_"));
แต่นั่นหมายความว่าหนึ่งในสองสายที่ไม่สนใจตัวพิมพ์เล็กและตัวพิมพ์ใหญ่นั้นจะไม่เห็นด้วยกับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่