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
相同,但区分大小写。一些系统用名为 stricmp
或 strcmpi
的函数提供此功能。为了区分大小写地比较两个字符串的子集,各种系统可能提供 strncasecmp
、strnicmp
或 strncmpi
。
#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;