strcmp简介:
strcmp是C语言中常用函数之一,主要作用为比较字符串的大小。
他的函数声明如下所示:
int strcmp ( const char * str1, const char * str2 );
声明中的const起到修饰作用,读者可理解为将传入字符串保护起来,不能在比较过程中随意更改.
如上所示,这个函数的返回值是int类型,这就牵扯到了他的返回值:
C语言规定:(图片来自www.cplusplus.com)
传入的第一个字符串大于第二个字符串时 return 1
传入的第一个字符串小于第二个字符串时 return -1
传入的第一个字符串等于第二个字符串时 return 0;
其做出大小判断的方式比较是字符串中每个字符的ASCII码值,其比较的方式则是逐个字符比较。
基于其比较的方式与做出判断的基本思路,我们可以对strcmp函数进行模拟实现。
如上图代码所示,我们封装了一个my_strcmp函数,供我们模拟实现strcmp函数。
模拟实现:
我们为了防止传入空指针的情况,采用了assert函数进行断言,防止出现对NULL的解引用从而造成的非法访问(可以去掉,但安全性会下降)(使用assert记得调用其头文件 assert.h )
根据其逐个字符比较的特征,我们首先搭建一个while循环框架,让两串字符串从第一个字符开始进行比较。一旦开始比较,则牵扯到比较过程中的三种情况:
1.两个字符串确实相等,则在while循环的大背景下,pc1与pc2应该同时来到'\0’的位置,通过了while的判断条件,如果被if判断语句检测出此时二者均为'\0',那就可以进行 return 0; 操作,主函数接收后输出:”两串字符串相等“
2 and 3.两个字符串不相等,则此时pc1与pc2指向了二者不同的字符上,经过下面的if判断语句,进行数值的返回;主函数接收后进行相应的输出。
注:每次经过while循环一次,数组指针都要向后移动一位,这点至关重要,否则很容易形成死循环从而程序崩溃。
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* pc1, const char* pc2)
{
assert(pc1 != NULL && pc2 != NULL);
while (*pc1 == *pc2)
{
if (*pc1 == '\0')
{
return 0;
}
pc1++;
pc2++;
}
if (*pc1 > *pc2)
{
return 1;
}
else if (*pc1 < *pc2)
{
return -1;
}
}
int main()
{
char arr1[10];
char arr2[10];
printf("请输入第一个字符串:>\n");
gets(arr1);
printf("请输入第二个字符串:>\n");
gets(arr2);
int ret = my_strcmp(arr1, arr2);
if (ret == -1)
{
printf("第一串 小于 第二串\n");
}
else if (ret == 1)
{
printf("第一串 大于 第二串\n");
}
else
{
printf("两串字符串相等 \n");
}
}