语法

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <string.h>

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

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
strverscmp()Thread safetyMT-Safe

名称

strverscmp-比较两个版本字符串

说明

通常一个文件有jan1jan2,...,jan9jan10,...,而当ls(1)向他们订购jan1jan10,...,jan2,...,jan9时,感觉不对。为了解决这个问题,GNU向ls(1)引入了-v选项,该选项是使用versionsort(3)实现的,该版本又使用了strverscmp()。

因此,strverscmp()的任务是比较两个字符串并找到"正确"的顺序,而strcmp(3)仅查找字典顺序。此函数不使用语言环境类别LC_COLLATE,因此主要用于预期字符串应为ASCII的情况。

该功能的作用如下。如果两个字符串相等,则返回0。否则,使用两个字符串相等的属性找到两个字节之间的位置,而在两个字符串之后紧随其后。查找包含(或开始于或结束于此位置)的最大连续数字字符串。如果其中一个或两个为空,则返回strcmp(3)返回的值(字节值的数字顺序)。否则,请对两个数字字符串进行数字比较,将具有一个或多个前导零的数字字符串解释为好像它们前面有一个小数点(因此,尤其是具有多个前导零的数字字符串位于具有较小前导零的数字字符串之前)。因此,顺序为000、00、01、010、09、0、1、9、10。

STRVERSCMP - Linux手册页

Linux程序员手册 第3部分
更新日期: 2020-06-09

遵循规范

此函数是GNU扩展。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

返回值

如果发现s1分别早于,等于或晚于s2,则strverscmp()函数将返回小于,等于或大于零的整数。

示例

下面的程序可用于演示strverscmp()的行为。它使用strverscmp()比较作为命令行参数给出的两个字符串。其用法示例如下:

$ ./a.out jan1 jan10
jan1 < jan10

Program source

#define _GNU_SOURCE
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    int res;

    if (argc != 3) {
        fprintf(stderr, "Usage: %s <string1> <string2>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    res = strverscmp(argv[1], argv[2]);

    printf("%s %s %s\n", argv[1],
            (res < 0) ? "<" : (res == 0) ? "==" : ">", argv[2]);

    exit(EXIT_SUCCESS);
}

另外参见

重命名(1),strcasecmp(3),strcmp(3),strcoll(3)

日期:2019-08-20 18:01:27 来源:oir作者:oir