在 C 语言中,strcoll()函数根据当前的区域设置比较两个字符串。与strcmp()不同,strcoll()考虑了本地化的字符排序规则,而strcmp()是基于字符的 ASCII 值进行比较的。

strcoll 函数头文件

strcoll函数的头文件是<string.h>。在使用strcoll函数前,确保在你的 C 代码中包含这个头文件:

#include <string.h>

strcoll 函数原型

int strcoll(const char *s1, const char *s2);

strcoll函数将s1指向的字符串与s2指向的字符串进行比较,这两个字符串会按照当前区域设置的LC_COLLATE类别进行解释。

strcoll()函数依赖于当前的区域设置,因此在不同的区域设置下,它可能会给出不同的比较结果;如果没有正确设置区域设置,或所在系统不支持,strcoll()可能会根据默认的 C 语言环境进行比较。

在 Linux 系统上,可通过命令locale -a查看支持的区域设置:

查看支持的区域设置
命令运行结果

函数参数

  • s1:指向第一个字符串的指针;

  • s2:指向第二个字符串的指针;

返回值

strcoll函数返回一个大于、等于或小于0的整数;

如果两个字符串完全相同,则返回0

strcoll 示例代码

如果所在的系统不支持区域设置en_US.utf8,则strcmp()strcoll()的比较结果可能一样;

#include <stdio.h>
#include <string.h>
#include <locale.h>

int main() {
    // 定义字符串,包含普通字母和重音字符
    char str1[] = "café";
    char str2[] = "cafe";

    // 使用 strcmp 比较
    int strcmp_result = strcmp(str1, str2);

    // 设置区域为 en_US.utf8(美国英语区域)
    setlocale(LC_COLLATE, "en_US.utf8");
    // 使用 strcoll 比较
    int strcoll_result_us = strcoll(str1, str2);

    printf("strcmp result: %d\n", strcmp_result);
    printf("strcoll result (en_US.utf8 locale): %d\n", strcoll_result_us);

    return 0;
}

程序运行效果

strcmp result: 94
strcoll result (en_US.utf8 locale): 1