1.strcpy函数:用于字符串的拷贝。
char* My_strcpy(char *dest, const char *src)
{
assert(dest != NULL);
assert(src != NULL);
char *start = dest;
while (*dest++ = *src++)
{
;
}
return start;
}
加入断言增加函数的健壮性,对不需要修改的字符串用const修饰,返回char*实现函数间的链式访问。
注意末尾加‘\0’。
2.strcat函数:用于将一个字符串补在另一个字符串后。
char* My_strcat(char *dest, const char *src)
{
assert(dest != NULL);
assert(src != NULL);
char *start = dest;
while (*dest != '\0')
{
dest++;
}
while ((*dest++ = *src++))
{
;
}
return start;
}
3.memcpy函数: 用于内存拷贝,将一块内存中的值拷贝到另一块内存中,sz为拷贝的字节数。
void* My_memcpy(void *dest, void *src, int sz)
{
assert(dest != NULL);
assert(src != NULL);
int i = 0;
char *start = (char*)dest;
char *start2 = (char*)src;
while (i < sz)
{
*start = *start2;
start++;
start2++;
i++;
}
return dest;
}
void*类型的指针可以接受任意类型的指针,实现函数的多用性,但void*类型的指针不能进行运算,若要计算需要进行强制类型转换,函数返回类型为void*,所以用时也要进行强制类型转换。
4.memmove函数:与memcpy作用相同,但这个函数考虑重叠问题,判断进行从前向后拷贝或从后向前拷贝。
如:1,2,3,4,5,6,7;将2,3,4,5拷贝到4,5,6,7处得到1,2,3,2,3,4,5。而不会被覆盖为1,2,3,2,3,2,3。
注意:有些编译器将memmove和memcpy功能实现的相同,C语言标准并没有对此做出严格规定。
void* My_memmove(void *dest, void *src, int sz)
{
assert(dest != NULL);
assert(src != NULL);
int i = 0;
char *start = (char*)dest;
char *start2 = (char*)src;
if (start < src)
{
//1
while (i < sz)
{
*start = *start2;
start++;
start2++;
i++;
}
}
else
{
//-1
while (sz--)
{
*(start + sz) = *(start2 + sz);
}
}
return dest;
}
5.strstr函数:用于在一个字符串中查找另一个字符串,返回第一次找到的地址。
char* My_strstr(const char *dest, const char *src)
{
assert(dest != NULL);
assert(src != NULL);
const char *start = dest;
const char *sss = src;
while (*dest)
{
dest = start;
src = sss;
while ((*dest == *src) && *dest && *src)
{
dest++;
src++;
}
if (*src == '\0')
{
return (char *)start;
}
if (*dest == '\0')
{
return NULL;
}
start++;
}
}