(一)strcmp函数的模拟实现
strcmp函数原型
cs
int strcmp(const char *str1, const char *str2);
strcmp函数的功能是按ASCII码依次逐字符对比两个字符串,直到出现不同字符或者遇到 \0 。 返回值规则
- str1 > str2 → 返回 大于0的整数 2。 str1 == str2 → 返回 0 。3. str1 < str2 → 返回 小于0的整数
1.理论分析:
创建两个指针分别指向两个待比较的字符串,用while循环持续比较两个字符串的字符,while后面()中的条件填写*str1==*str2,因为只有此时的两个字符相等,才能继续往下比较,这里要注意,在while循环里面要加一个条件判断语句,判断此时两个字符都相等时的str1或str2是否为\0,如果是,那么就证明已经比较完成,两个字符串相等,返回0,如果不=\0,两个指针分别向后+1,如果不相等了,不满足while循环的条件了,那么跳出while循环,直接返回*str1-*str2的值,如果str1>str2,那么就会返回>0的值,否则相反
2.代码实现
cs
int my_strcmp(char* str1, char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return (*str1 - *str2);
}
int main()
{
char str1[] = "abc";
char str2[] = "abd";
int ret = my_strcmp(str1, str2);
printf("%d", ret);
return 0;
}
(二)strstr函数的模拟实现
strstr函数的原型
strstr函数的功能是在字符串 str 中查找子串 substr 首次出现的位置。 1. 找到:返回子串首字符的指针 2. 找不到:返回 NULL 3. 如果 substr 是空字符串 "" ,直接返回 str
1.理论分析:
strstr的模拟函数实现有点复杂,我们需要讨论多个情况
一:
cs
char str[] = "abcdef";
char sub[] = "abc";
如上代码中,能在str一开始中直接找到sub中的字符,那么在模拟函数中,用两个指针分别指向str的和sub,然后将*str==*sub作为while循环里的条件,逐渐+1,直至*sub==/0,代表全部查找完成,然后返回此时str首元素的地址
二:
cs
char str[] = "abcdef";
char sub[] = "cde";
如上代码中,在str中间部分找到sub中的部分,那么在模拟函数中,用两个指针s1和s2分别指向str的和sub,将*s1!=*s2&&*s1!=\0&&*s2!=\0作为while循环里面的条件,表示此时指针指向的s1不等于s2,同时不等于\0代表没找完,所以让两个指针分别向后+1,继续比较,如果跳出这个while循环,再判断如果s2指向了\0的位置,那么代表查找完毕,返回此时的s1的指针
三:
cs
char str[] = "abcdddef";
char sub[] = "dde";
如上代码中,第一次能在str中查找到sub中的前两个元素,但是继续往后比较却不相等了,那么此时应该从第一次配对成功的地方,指针往后+1,然后sub的指针得重新指向其原来的首元素地址重新比较,此时我们就需要额外的一个指针来标记第一次配对成功时str1的地址,当后面配对一半失败时,直接调用这个指针往后+1,重新配对
结合上述三种情况,我们用如下代码实现
cs
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* my_strstr(const char* str, const char* sub)
{
const char* s1 = NULL;
const char* s2 = NULL;
const char* ch = str;
if (*sub == '\0')
{
return str;
}
while (*ch)
{
s1 = ch;
s2 = sub;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return ch;
}
ch++;
}
return NULL;
}
int main()
{
char str[] = "abcdddef";
char sub[] = "dde";
const char* ret = my_strstr(str, sub);
if (ret != NULL)
{
printf("%s", ret);
}
else
printf("没找到");
return 0;
}