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的实现
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"中的每个字符