1.strlen
size_t strlen ( const char * str );
- 求字符串的长度,方法是从开始到遇到第一个'\0',
- 字符串已 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )
- 参数指向的字符串必须要以 '\0' 结束
- 注意函数的返回值为size_t,是无符号
size_t my_strlen(const char* str)
{
int count = 0;//计数器
assert(str != NULL);
while (*str != '\0')
{
count++;
str++;
}
return count;
}
2.strcpy
char* strcpy(char * destination, const char * source );
- 把 source所指向的字符串复制到 destination
- 源字符串必须以 '\0' 结束
- 会将源字符串中的 '\0' 拷贝到目标空间
- 目标空间必须足够大,以确保能存放源字符串
- 目标空间必须可变
char *my_strcpy(char *dest, const char*src)
{
char *ret = dest;
assert(dest!= NULL);
assert(src!= NULL);
while ((*dest++ = *src++))
{
;
}
return ret;
}
3.strcmp
int strcmp ( const char * str1, const char * str2 );
- 把 str1 所指向的字符串和 str2 所指向的字符串进行比较
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
int my_strcmp(const char*s1, const char* s2)
{
assert(s1);
assert(s2);
while (*s1 == *s2)
{
if (*s1 == '\0')
return 0;
s1++;
s2++;
}
return *s1 - *s2;
}
4.strcat
char * strcat ( char * destination, const char * source );
- 把 source 所指向的字符串追加到 destination 所指向的字符串的结尾
- 源字符串必须以 '\0' 结束
- 目标空间必须有足够的大,能容纳下源字符串的内容
- 目标空间必须可修改
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
//1. 找目的地空间的'\0'
while (*dest)
{
dest++;
}
//2. 拷贝数据
while (*dest++ = *src++)
{
;
}
return ret;
}
5.strstr
char * strstr ( const char * str1, const char * str2);
- 在字符串str1中查找第一次出现字符串str2的位置
- 返回起始地址(第一次找到的地址)
char* my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
const char* s1 = str1;
const char* s2 = str2;
const char* cp = str1;
if (*s2 == '\0')
{
return (char*)str1;
}
while (*cp)
{
//一次匹配查找的过程
s1 = cp;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cp;
}
cp++;
}
return NULL;
}
6.memcpy
void * memcpy ( void * destination, const void * source, size_t num );
- 从source的位置开始向后复制num个字节的数据到destination的内存位置
- 这个函数在遇到 '\0' 的时候并不会停下来
- 如果source和destination有任何的重叠,复制的结果都是未定义的
void* my_memcpy(void*dest, const void*src, size_t count)
{
void* ret = dest;
assert(dest);
assert(src);
while (count--)
{
//拷贝一个字节
*(char*)dest = *(char*)src;
dest = (char*)dest+1;
src = (char*)src+1;
}
return ret;
}
7.memmove
void * memmove ( void * destination, const void * source, size_t num );
- 从source复制num个字节到destination
- 但是在重叠内存块这方面,memmove() 比 memcpy() 更安全
- 如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改
- 如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同
void* my_memmove(void* dest, const void* src, size_t count)
{
assert(dest);
assert(src);
if (dest < src)
{
//前-->后
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//后-->前
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
}