C 库函数 - strcmp()
描述
C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
声明
下面是 strcmp() 函数的声明。
c
int strcmp(const char *str1, const char *str2);
参数
str1-- 要进行比较的第一个字符串。str2-- 要进行比较的第二个字符串。
返回值
该函数返回值如下:
- 如果返回值小于 0,则表示
str1小于str2。 - 如果返回值大于 0,则表示
str1大于str2。 - 如果返回值等于 0,则表示
str1等于str2。
模拟实现
比较方式:依次比较 ASCII 大小,大返回正数,小于返回负数,等于则比较下一位。若全都相等则返回 0。
1.0 版本
c
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char *str1, const char *str2)
{
assert(str1 && str2);
// 依次比较 ascii 大小
while (*str1 == *str2)
{
// 相等且都为 '\0'
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return (*str1 - *str2);
}
int main()
{
const char *str1 = "aaaa";
const char *str2 = "bbbb";
int ret = my_strcmp(str1, str2);
printf("%d\n", ret);
return 0;
}
说明:原 1.0 版本中
if (str1 == '\0')应改为if (*str1 == '\0');char*应改为const char*,因为字符串字面量不可修改。
2.0 版本
c
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char *src, const char *dst)
{
int ret = 0;
assert(src != NULL);
assert(dst != NULL);
// 以字符类型(以字节为单位)进行整型计算
while (*dst && *src && !(ret = *(unsigned char *)src - *(unsigned char *)dst))
++src, ++dst;
if (ret < 0)
ret = -1;
else if (ret > 0)
ret = 1;
return ret;
}
代码优化
综合以上两种写法,可以优化为更简洁、更符合标准、更安全的版本:
c
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char *str1, const char *str2)
{
assert(str1 != NULL && str2 != NULL);
while (*str1 && *str1 == *str2)
{
++str1;
++str2;
}
return (*(unsigned char *)str1 - *(unsigned char *)str2);
}
int main(void)
{
const char *str1 = "aaaa";
const char *str2 = "bbbb";
int ret = my_strcmp(str1, str2);
printf("%d\n", ret);
return 0;
}