strcpy
函数作用:把src的字符串放到dst的位置。
char* strcpy(char* dst, const char* src) //该函数是没有考虑重叠的
{
assert(dst); //当函数返回值不是void时用assert方便一些
assert(src);
char* res = dst;
while((*dst++ = *src++) != '\0');
return res;
}
char* strcpy(char* dst, const char* src)
{
assert((dst != NULL) && (src != NULL));
char* res = dst;
int size = strlen(src) + 1; //因为src是指针类型,sizeof都是4,所以要用strlen
if(dst > src && dst < src + len)
{
dst = dst + size - 1;
src = src + size - 1;
while(size--)
{
*dst-- = *src--;
}
}
else
{
while(size--)
{
*dst++ = *src++;
}
}
return res;
}
memcpy
函数作用:把src的字符串的前size个字符放到dst的位置。
void* memcpy(void* dst, const void* src, size_t size)
{
if(dst == NULL || src == NULL)
{
return NULL;
}
void* res = dst;
char* pdst = (char*)dst; //memcpy的形参为void*型,要注意转换
char* psrc = (char*)src;
if(pdst > psrc && pdst < psrc + size) //重叠
{
pdst = pdst + size - 1;
psrc = pdst + size - 1;
while(size--)
{
*pdst-- = *psrc--;
}
}
else //无重叠
{
while(size--)
{
*dst++ = *src++;
}
}
return res;
}
strcat
函数作用:把src的字符串粘贴到dst位置字符串的后面。
char* strcat(char* dst, const char* src)
{
char* res = dst;
while(*dst != '\0') //当dst遍历到\0的时候退出,这样src正好从\0开始覆盖
++dst;
while (*src != '\0')
{
*dst++ = *src++;
}
return res;
}
strcmp
函数作用:比较str1与str2是否相等,如果相等返回0,如果str1<str2返回-1,str>str2返回1(下面的函数是返回差值)。
int strcmp(const char* str1, const char* str2)
{
while(*str1 == *str2 && *str1 != '\0') //不等或到头了退出,计算差值
{
++str1;
++str2;
}
return *str1 - *str2; //这样返回顺便计算了是str1大还是str2大
}