一、strcmp()
1、标准规定
第一个字符串大于第二个字符串,则返回大于0的值
第一个字符串小于第二个字符串,则返回小于0的值
第一个字符串等于第二个字符串,则返回0
2、模拟实现
int strcmp(const char* str1, const char* str2)
{
assert(str1 != '\0' && str2 != '\0');//设置断言,确保str1和str2不是空值,若是空值。系统会报错
while (str1 != '\0' && str2 != '\0')
{
if (*str1 > *str2)
{
return 1;
}
else if (*str1 < *str2)
{
return -1;
}
else
{
str1++;
str2++;
}
}//此时从上个循环跳出,说明两个指针中的一个已经指到了\0,此时进一步比较
if (*str1 < *str2)
{
return -1;//这种情况是str1先到\0,则str1小
}
else if (str1 > str2)
{
return 1;//这种情况是str2先到\0,则str1小
}
else
{
return 0;//这种情况是相等
}
}
二、strstr()
1、用法:
strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。
找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;
如果未找到所搜索的字符串,则返回NULL。
2、模拟实现
const char* strstr(const char* str, const char* aim)
{
assert(str != NULL && aim != NULL);//设置断言,确保str1和aim不是空值,若是空值。系统会报错
if (aim == '\0')
{
return NULL;
}
const char* black = str;
while (*black != '\0')
{
const char* red = black;
const char* a = aim;
while (*red == *a && *a != '\0' && *black != '\0')
{
red++;
a++;
}
if (*a == '\0')
{
return black;
}
else if (*black == '\0')
{
return NULL;
}
else
{
black++;
}
}
return NULL;
}
三、memcpy()
1、功能
由sou所指内存区域复制num个字节到des所指内存区域。
2、位于string.h头文件里,但与字符串无关系,拷贝的是内存,可以拷贝任何类型的变量类型
3、该函数在遇到’\0’的时候不会停下来
4、如果sou和des有任何重叠,复制结果都是未定义的
5、模拟实现
void* memcpy(void* des, const void* sou, size_t num)
{
assert(des != NULL && sou != NULL);
char* d = (char*)des;
char* s = (char*)sou;
while (num--)
{
*d = *s;
d++;
s++;
}
return des;
}
四、memmove()
1、功能
memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
2、和memcpy()区别
memcpy处理的源内存块和目标内存块是可以重叠的
3、目标实现
void* memmove(void* des, const void* sou, size_t num)
{
assert(des != NULL && sou != NULL);
char* d = (char*)des + num - 1;
char* s = (char*)sou + num - 1;
while (num--)
{
*d = *s;
d--;
s--;
}
return des;
}