目录
strcmp
首先我们需要了解strcmp函数的用法,strcmp - Compare strings(比较字符串)
由于字符串的比较不能像整形那样直接用等号比较
//这样比较是有问题的
if ("abcd" > "abc")
printf(">\n");
else if ("abcd" < "abc")
printf("<\n");
else
printf("==\n");
而strcmp
就是用来进行字符串比较
字符串的比较规则是将两个字符串的每一位进行对比,相等就走下一位,直到不相等的时候哪个字符串的元素大则该字符串更大。
例:
“abcd” < “abd”
“abcdef” > “abcd”
代码实现
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
//
while (*str1 == *str2)
{
//进入循环证明此时*str1与*str2相等
//*str1与*str2等于'\0'就返回零
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
/*if (*str1 > *str2)
return 1;
else
return -1;*/
return *str1 - *str2;
}
可以看出,
strcmp
的返回值是根据大小关系返回大于小于或等于0的数
所以我们不再使用if返回1或-1,直接使用*str1-*str2
即可
int main()
{
char arr1[] = "abcdef";
char arr2[] = "dcba";
printf("%d\n", strcmp(arr1, arr2));// -1
printf("%d\n", my_strcmp(arr1, arr2));// -3
//<
if (my_strcmp(arr1, arr2) > 0)
printf(">\n");
else if (my_strcmp(arr1, arr2) < 0)
printf("<\n");
else
printf("==\n");
return 0;
}
调用上述代码,则会输出
-1
-3
<
strstr
strstr - Find a substring(找到子字符串)
char *strstr( const char *str1, const char *str2 );
实则找str2第一次出现在str1中的位置;
模拟实现时,尽量不直接改变*str1,*str2,额外定义指针进行改动
- 如果s1 != s2,则cp++,反之s1++,s2++
- 当cp移动后,将cp重新赋给s1,如果此时s2未到’\0’,则s2回到起始位置
char* my_strstr(const char* str1, const char* str2)
{
char* s1 = NULL;
char* s2 = NULL;
char* cp = (char*)str1;
//当cp走到'\0'函数都没有返回则证明找不到,返回空
while (*cp)
{
s1 = cp;
s2 = (char*)str2;
//如果此时*s1或*s2该位置为'\0',或*s1 != *s2,退出下面循环(s1,s2不再后移)
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cp;
cp++;
}
return NULL;
}
下面进行测试
int main()
{
char arr1[] = "abbbcde";
char arr2[] = "bbc";
printf("%s\n", my_strstr(arr1, arr2));//bbcde
char arr3[] = "abcdef";
char arr4[] = "ce";
printf("%s\n", my_strstr(arr3, arr4));//(null)
return 0;
}