跳转到内容

C 编程/string.h/strcmp

来自维基教科书,自由的教科书

在 POSIX 和 C 编程语言中,strcmp 是 C 标准库(在 string.h 中声明)中的一个函数,用于比较两个 C 字符串。

ISO/IEC 9899:1999,7.21.4.2 中的原型

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

strcmp 当字符串相等时返回 0,当 s1 小于 s2 时返回负整数,或者当 s1 大于 s2 时返回正整数,根据词典顺序。

strcmp 的变体 strncmp 仅比较字符串到某个偏移量。

另一个变体 strcasecmp 符合 POSIX.1-2001,工作方式与 strcmp 相同,但区分大小写。一些系统用名为 stricmpstrcmpi 的函数提供此功能。为了区分大小写地比较两个字符串的子集,各种系统可能提供 strncasecmpstrnicmpstrncmpi

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

int main (int argc, char **argv)
{
    int v;

    if (argc < 3)
    {
        fprintf (stderr, "Compares two strings\nUsage: %s string1 string2\n",argv[0]);
        return EXIT_FAILURE;
    }

    v = strcmp (argv[1], argv[2]);

    if (v < 0)
        printf ("'%s' is less than '%s'.\n", argv[1], argv[2]);
    else if (v == 0)
        printf ("'%s' equals '%s'.\n", argv[1], argv[2]);
    else if (v > 0)
        printf ("'%s' is greater than '%s'.\n", argv[1], argv[2]);

    return 0;
}

上面的代码是一个工作示例,它打印第一个参数是否小于、等于或大于第二个参数。

一个可能的实现是(P.J. Plauger,The Standard C Library,1992)

int strcmp (const char * s1, const char * s2)
{
    for(; *s1 == *s2; ++s1, ++s2)
        if(*s1 == 0)
            return 0;
    return *(unsigned char *)s1 < *(unsigned char *)s2 ? -1 : 1;
}

但是,大多数现实世界的实现将具有各种优化技巧来减少函数的执行时间。你会注意到,strcmp 不仅返回 -1、0 和 +1,还返回其他负值或正值,这源于优化了由 ?: 运算符引入的分支。

return *(const unsigned char *)s1 - *(const unsigned char *)s2;
[编辑 | 编辑源代码]

模板:Compu-prog-stub

华夏公益教科书