Hàm strcoll() so sánh hai chuỗi theo quy tắc collation (sắp xếp) của locale hiện tại. Khác với strcmp so sánh theo giá trị byte (lexicographical).
Trả về
- 0: Hai chuỗi bằng nhau (theo locale)
- > 0:
str1>str2(theo locale) - < 0:
str1<str2(theo locale)
Cú pháp
int strcoll(const char *str1, const char *str2);
Ví dụ
#include <stdio.h>
#include <string.h>
#include <locale.h>
int main() {
setlocale(LC_COLLATE, "en_US.UTF-8"); // Thiet lap locale
const char *s1 = "Helloworld";
const char *s2 = "Blank";
int result = strcoll(s1, s2);
if (result > 0) printf("s1 > s2 (theo locale)\n");
else if (result < 0) printf("s1 < s2 (theo locale)\n");
else printf("s1 == s2\n");
return 0;
}
Kết quả
s1 > s2 (theo locale)
Giải thích: Theo locale en_US, 'H' > 'B' nên s1 > s2. Kết quả giống strcmp trong trường hợp ASCII đơn giản, nhưng khác với Unicode/accented chars.
Khi nào dùng strcoll?
- Sắp xếp chuỗi cho người dùng (UI, danh bạ, từ điển) – tuân theo quy tắc ngôn ngữ/locale.
- Ví dụ: Trong tiếng Đan Mạch, 'Å' sắp sau 'Z'; tiếng Đức 'ß' = 'ss'.
strcoll vs strcmp
| Đặc điểm | strcmp | strcoll |
|---|---|---|
| Quy tắc so sánh | Byte value (lexicographic) | Locale collation rules |
| Hiệu năng | Nhanh | Chậm hơn (phức tạp) |
| Dùng cho | Key nội bộ, binary data | Hiển thị cho user, sorting |
Lưu ý: Cần gọi
setlocale(LC_COLLATE, "") hoặc locale cụ thể trước khi dùng. C++: dùng std::locale + std::collate facet.