⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:C语言初阶
⭐代码仓库:C Advanced
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!
模拟strcmp函数
前言
strcmp库函数大家可能会比较陌生,用的不多,但是,大家经常搞错的是按照的是字符串长度进行比较的,而真的是这样吗?事实上,strcmp函数是按照字母在字典中按照A ~ Z和a ~ z进行比较的。而且是以ASCII码进行比较的,接下来,让我们深入了解一下strcmp函数吧!
一、简介
1.认识strcmp
在认识这个函数之前,先来一张图片供大家先了解一下strcmp函数。
大家可能会好奇一件事情,这个返回值根据字典顺序返回的,那到底会返回什么呢?接下来,上代码,让大家看看返回值吧!
2.返回值
分为三种情况,一是字符串都一样,二是前面字符串大于后面字符串,三是后面字符串大于前面字符串。
在比较之前,有一个很重要的事就是,字符串之间的比较是根据ASCII码进行比较的。
(1).两者字符串相等
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "abcde";
char arr2[] = "abcde";
int tmp = strcmp(arr1, arr2);
printf("%d\n", tmp); //结果:0
return 0;
}
运行结果:
解析:字符从左往右数所有的ASCII码都一样。
(2).前者大于后者(ASCII)
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "abcdf";
char arr2[] = "abcde";
int tmp = strcmp(arr1, arr2);
printf("%d\n", tmp); //结果:1
return 0;
}
运行结果:
解析:e的ASCII码小于f的ASCII码。
(3).后者大于前者(ASCII)
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "abcde";
char arr2[] = "abcdf";
int tmp = strcmp(arr1, arr2);
printf("%d\n", tmp); //结果:-1
return 0;
}
运行结果:
解析:e的ASCII码小于f的ASCII码。
(4).总结
传入的第一个字符串大于第二个字符串时,返回值为1。
传入的第一个字符串小于第二个字符串时,返回值为-1。
传入的第一个字符串等于第二个字符串时,返回值为0。
3.逐个字母比较
(1).常规比较
当我们使用strcmp时候,是根据从左往右依次进行比较的,如果前面字母都一样,哪者多了一个字母就哪者大,理解为:多了的那个字母与’\0’进行比较,‘\0’代表的是ASCII码中的数字0,而多的字母是肯定比0大的,‘A’的ASCII 码值为65,'a’的ASCII码值为97。
(2).只比较前面
二、模拟实现strcmp
1.前序
在模拟使用这个库函数之前,我先放一个博客,是我之前写的关于模拟strcpy函数中关于assert和const的介绍:
模拟strcpy函数中的assert和const
2.实现
相信大家看了我的那篇博客,肯定对于这个assert和const有了很深的理解,那我们先实现一下简单的模拟实现。
#include<stdio.h>
int my_strcmp(const char* arr1, const char* arr2)
{
while (*arr1 == *arr2){ //从第一个往后遍历,一直遍历到不等于的那个字母
if (*arr1 == '\0'){
return 0;
}
arr1++;
arr2++;
}
if (*arr1 > *arr2){
return 1;
}
else if (*arr1 < *arr2){
return -1;
}
}
int main()
{
char arr1[10] = { 0 };
char arr2[10] = { 0 };
gets(arr1);
gets(arr2);
int ret = my_strcmp(arr1, arr2);
if (ret < 0){
printf("前小于后\n");
}
else if (ret > 0){
printf("前大于后\n");
}
else{
printf("前等于后 \n");
}
}
3.优化
既然大伙看了assert和const,那我们进行一次优化,加入assert吧!放置空指针进来!
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* arr1, const char* arr2)
{
assert(arr1, arr2);
//assert(arr1!=NULL&&arr2!=NULL);
while (*arr1 == *arr2) { //从第一个往后遍历,一直遍历到不等于的那个字母
if (*arr1 == '\0') {
return 0;
}
arr1++;
arr2++;
}
if (*arr1 > *arr2) {
return 1;
}
else if (*arr1 < *arr2) {
return -1;
}
}
int main()
{
char arr1[10] = { 0 };
char arr2[10] = { 0 };
gets(arr1);
gets(arr2);
int ret = my_strcmp(arr1, arr2);
if (ret < 0) {
printf("前小于后\n");
}
else if (ret > 0) {
printf("前大于后\n");
}
else {
printf("前等于后 \n");
}
}
三、习题
在介绍了那么多的知识,我们来一道习题体会一下strcmp函数的使用吧!
代码:
#include<stdio.h>
#include<assert.h>
int my_strcmp(char* s1, char* s2) {
assert(s1, s2); //断言,防止空指针的传入
int i = 0;
while (s1[i] != '\0' || s2[i] != '\0') { //遍历
if (s1[i] != s2[i]) { //找到第一个不相等的那个字母
return s1[i] - s2[i]; //返回值为ASCII码相减
}
i++;
}
return 0;
}
int main() {
int t = 0;
scanf("%d", &t); //输入有几组
int i = 0;
char s1[100] = { 0 };
char s2[100] = { 0 };
for (i = 0; i < t; i++) {
scanf("%s %s", s1, s2); //输入两个字符串
}
int cnt = my_strcmp(s1, s2);
printf("%d", cnt);
return 0;
}
解析:进入函数以后进行从左往右遍历,找到那个不相等的字母并进行ASCII码的相减,返回此值,我们在习题之前讲的都是比较简单的比较,但这个习题让大家充分理解的一下返回值是负数,正数和零,为什么?因为在计算机内部,计算机是以二进制的补码存放数字的,-1的补码很大,代表着后面的字符串大,1的补码还是1,代表着前面的字符串大,如果为0则两者字符串一样大。
总结
要理解strcmp函数还是有点困难,但当你仔细一步步去理解,打开MSDN去看一下理解一下含义就很快能够上手,理解完最后一道习题,就已经充分理解了全部的strcmp函数。