模拟实现字符串和内存操作函数(一)目录:
strlen
size_t strlen(const char* str)
- 字符串以‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包含’\0’)。
- 参数指向的字符串必须要以‘\0’结束。
- 函数的返回值为size_t,是无符号类型。
- 因为是模拟库函数,所以为了防止调用者放入空指针或者防止传入的字符串被修改,下面的函数中会用到assert函数和const。
size_t my_strlen(const char* p)
{
size_t count = 0;
assert(p != NULL);
while (*p)
{
count++;
p++;
}
return count;
}
strcpy
char* strcpy(char* dst,const char* src)
- strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char*。
- 源字符串必须以’\0’结束
- 会将源字符串的’\0’拷贝到目标空间
- 目标空间必须可变,并且具有足够大的空间来存放源字符串
char* my_strcpy(char* dst, const char* src)
{
char* str = dst;
assert(dest && src);
while (*dest++ = *src++);
//当指针指向位置为'\0'时结束拷贝
return str;
}
strcat
char* strcat(char* dst,const char* src)
- strcat把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面。
- 源字符串必须以’\0’结束
- 会将源字符串的’\0’拷贝到目标空间
- 目标空间必须可变,并且具有足够大的空间来存放源字符串
char* my_strcat(char* dst, const char* src)
{
assert(dst && src);
char* str = dst;
while (*dst)
{
dst++;
}
//找到dst的结束位置
while (*dst++ = *src++);
//在末尾拼接src
*dst = *src;
//拷贝src的'\0'
return str;
}
strcmp
int my_strcmp(const char* str1, const char* str2)
- strcmp两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。
- 源字符串必须以’\0’结束
- 当str1<str2时,返回为负数,
- 当str1=str2时,返回值= 0
- 当str1>str2时,返回为正数
- 需要将类型强转为unsighed char* ,因为对比的是ASCII码值,但是当大于127时会自动将其按照补码的形式转换为负数,则会产生错误
int my_strcmp(const char* str1, const char* str2)
{
unsigned char* s1 = (unsigned char* )str1;
unsigned char* s2 = (unsigned char* )str2;
while (*s1 && *s2)
{
if (*s1 < *s2)
return -1;
else if (*s1 > *s2)
return 1;
else
{
s1++;
s2++;
}
}
if ('\0' == *s1 && '\0' == *s2)
return 0;
else if ('\0' == *s1)
return -1;
else
return 1;
//当两边字符数不相同的时候进行判断
}
strstr
char* my_strstr(const char* src, const char* sub)
- strstr返回一个指针,指向sub在src中首次出现的位置。
char* my_strstr(const char* src, const char* sub)
{
assert(src && sub);
const char* src1 = src;
const char* sub1 = sub;
while (*src1)
{
while (*src1 == *sub1 && *sub1)
{
src1++;
sub1++;
}
if ('\0' == *sub1)
{
return src;
}
//当*sub1指向'\0'时,说明sub1和src1完全相同,此时返回src
else
{
sub1 = sub;
src1 = ++src;
}
//如果不同,则sub1回溯,*src1继续走向下一个位置
}
return NULL;
}
strchr
char* strchr(char* dst,const char* src)
- strchr返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针。
char* my_strchr(const char* str,const char c)
{
assert(str);
while (*str)
{
if (*str == c)
return str;
else
str++;
}
return NULL;
}