字符串的比较?strcmp和strncmp

目录

字符的比较

字符串的比较

strcmp函数

自定义实现

库函数原型

源码解析

strncmp函数

自定义实现


为什么会有字符串比较函数?

字符串为啥不能直接比较啊?

 以ASCII码值的大小作为字符比较的标准,如果某一个字符的ASCII码值的大于另一字符的ASCII码,则认为前一字符“大于”后一字符,如“C”大于“A”,“A"小于"B"

字符大小可以用下表由小到大排列:

空格! ” # $ % & ’ (

) * + , 一 .0 1 2 3

4 5 6 7 8 9 : ; <=

> ? @ A B C D E F G

H I J K L M N O P Q

R S T U V W X Y Z

[ \ ] ^ _ ' a b c d e f......


两个字符串比较,是将这两个字符串从左到右逐个字符比较:

1、如果两个字符串长度相等,且每一个相应位置上的字符都一样,就认为两个字符串相等,如:  “hello”=“hello”。

2、如果两个字符串长度不相等,则以第一个不相同的字符作为基准,而不考虑他们的长度及其后字符的比较结果。如: "he" > "haaaa"

3、如果两个字符串长度不相等,且所有相应位置上的字符都一样,则长者为大。

如:    “hello”>“hell”

注意:

1、当字符串有空格时,空格也参加比较。

2、字母大小写不同,ASCII代码值也不同。

3、由汉字组成的字符串也可以比较。

如:”张三” > ”李四” 实际比较内容是:zhangsan ,lisi

4、不是哪个字符串更长就更大,而是碰到第一个不同的字符之后,就返回结果。


字符的比较

字符串的比较

字符串的比较,比较的是首元素的地址。而地址是未知的,所以结果也无法预知。

 所以,我们需要用到两个库函数来进行字符串的比较。


strcmp函数

原理:

strcmp函数用于比较两个字符串的大小。从左向右逐个对照ASCⅡ值进行比较:

strcmp(str1,str2)

若str1 > str2,则返回值大于0

若str1 < str2,则返回值小于0

若str1 = str2,则返回值为0

int strcmp (const char* str1, const char* str2)//函数原型
//str1 和 str2 分别指向一个字符串,返回值是int类型

函数的使用:

自定义实现

先上代码:>

#include <stdio.h>
#include <string.h>
int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0') return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

int main()
{
	char* a = "abcd";
	char* b = "adcd";
	int ret1 = my_strcmp(a, b);
	if (ret1 > 0) printf("a>b,差值为%d", ret1);
	else if (ret1 < 0) printf("a<b,差值为%d\n", -ret1);
	else printf("a==b");
}

再讲过程:>

首先,确定函数的参数和返回类型

int my_strcmp(const char* str1, const char* str2)
{

}

接着,进行实现

 由于只能返回1、0、-1,那么如果想要看到两个字符的差值呢?

那么只需要将return处改为二者相减即可:>

int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (*str1 == '\0') return 0;
		str1++;
		str2++;
	}
    return *str1-*str2;
}

库函数原型

自定义实现完,我们看看库函数的原型吧

int __cdecl strcmp (
        const char * src,
        const char * dst
        )
{
    int ret = 0 ;

    while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) == 0 && *dst)
        {
            ++src, ++dst;
        }
    return ((-ret<0))-(ret<0);
}

源码解析

在while循环中的判断条件:

1、return 中有两个表达式(-ret<0)与(ret<0)表达式结果只有1和0

      所以,最后返回值只有1、0、-1

2、首先,令ret等于两个字符相减,如果ret==0  && 字符串此时来到\0

      那么&&的判断为真,前面有!(非),所以while条件为假,直接进入return

      由于ret=0,所以两个表达式结果都为0,相减为0,最终就会返回0 

3、如果ret != 0 && 字符串没有来到\0

      那么判断条件为真,!作用之后为假。while条件为假,跳出while循环,进入return

4、如果ret==0但是字符串没有来到\0,那么&&条件为假,!之后为真,while条件为真,进入循环,字符串向后走。


strncmp函数

 和strcmp相似,但是strncmp可以用于比较前n个字符,使得比较字符串更加灵活。

自定义实现

int my_strncmp(const char*dest, const char* src, int n)
{
	while ((--n) && (*dest == *src))
	{
		dest++;
		src++;
	}
	return *dest-*src;
}

  • 30
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值