C语言:比较两个字符串是否相等

C语言例子 专栏收录该内容
2 篇文章 0 订阅

1) 使用strcmp进行比较

下面通过一个例子进行演示:

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

int main(void)
{
	char* str1 = "abc";
	char* str2 = "abc";

	if (strcmp(str1, str2) == 0) {
	    printf("str1和str2相同!\n");
	}
	else {
	    printf("str1和str2不相同!\n");
	}

	return 0;
}

讲解上面的程序:

定义了一个char(字符型)的指针变量str1,并且初始化为 "abc"

定义了一个char(字符型)的指针变量str2,并且初始化为 "abc"

通过strcmp进行比较两个字符串是否相同,如果相同返回0(详细见strcmp百度百科)

 

2) strcmp的实现

(实现代码来源于strcmp百度百科)

int __cdecl strcmp (const char *src, const char *dst)
{
        int ret = 0 ;
        while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
        {
                ++src;
                ++dst;
        }
        if ( ret < 0 )
                ret = -1 ;
        else if ( ret > 0 )
                ret = 1 ;
        return( ret );
}

下面进行讲解:

定义了一个int(整型)的变量ret,并且初始化为0

(unsigned char*) src 表示将src强制转换为unsigned(无符号)的char(字符型)变量 (同理dst)

*(unsigned char*) src 表示获取src中的数据(同理dst)

*(unsigned char*) src - *(unsigned char*)dst,

*(unsigned char*) src表示获取当前src的数据,(假设为"a")

*(unsigned char*)dst表示获取当前dst的数据,(假设为"a")

根据ASCII码表 "a"为65,(ASCII码表)

所以src - dst,所表示的就是 65 - 65,返回结果为0

(ret = *(unsigned char *)src - *(unsigned char *)dst),所以ret 为0

!(ret = *(unsigned char *)src - *(unsigned char *)dst),取反ret

*dst,*dst为获取dst的数据,因为每个字符串的结尾都有一个"\0"(ASCII码表中为0)

判断true和false,其实就是0为false,非0为true,所以可以得出,

如果dst到了字符串末尾,则退出循环

++src,表示将src的指针向后移动一位(同理dst) (如果这里不懂的可以看下面)

下面的if...else if则是根据ret的返回值进行返回对应的数值(详细见strcmp百度百科)

PS :(因为char、unsigned char 都只占一个字符,所以*src也就获取当前src所指向的字符)

 

3)不懂++src的可以看下

++src,表示将src的指针向后移动一位

 

好的,下面进行讲解:

假设当前src的地址为(0x00898b3c),

先说src的类型,当前src的类型为char(字符型),char所占内存大小为1字节,

所以++src后src的地址就变成了(0x00898b3d),

最后通过++src也就能遍历整个src所指向的内存地址中的数据,然后和dst比较

首先假设src当前所指向的是 "abc" 的内存地址

当前src为(0x00898b3c),所指向的是"a"

所以*src也就是为"a",(可能你们会疑问为什么是"a")

因为char所占内存大小为1字节,

所以*src获取的数据也就只获取当前src当前所指向的内存地址的一位中的数据,

可以这样理解:

(0x00898b3c)中为"a"

(0x00898b3d)中为"b"

(0x00898b3e)中为"c"

(0x00898b3f)中为"\0"

所以++src就是不断向后移动指针进行遍历"abc"中的每个字符

 

 

 

  • 16
    点赞
  • 3
    评论
  • 60
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值