Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Hàm strcoll() trong C/C++

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ểmstrcmpstrcoll
Quy tắc so sánhByte value (lexicographic)Locale collation rules
Hiệu năngNhanhChậm hơn (phức tạp)
Dùng choKey nội bộ, binary dataHiể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.