一、memmove
void *memmove( void *dest, const void *src, size_t count );
memmove函数将count字节的字符从src复制到dest。
如果源区域和目标区域的某些区域重叠,memmove将确保在覆盖之前复制重叠区域中的原始源字节。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dst, const void* src, size_t count)
{
void* ret = dst;
assert(dst);
assert(src);
//dst <= src表示,如果dst在src的前面,从前往后复制不会覆盖src中还没有复制的内容
if (dst <= src || (char*)dst >= ((char*)src + count))
{
//从前往后复制,则不会出现覆盖src中没有复制的内容
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
else
{
//从后往前复制,则不会出现覆盖src中没有复制的内容
dst = (char*)dst + count - 1;//移动到末尾
src = (char*)src + count - 1;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return ret;
}
int main()
{
char arr[10] = "abcdefg";
char arr0[10] = "abcdefg";
char arr1[10] = { 0 };
my_memmove(arr + 2, arr, 4);
my_memmove(arr1, arr0, 4);
printf("内存覆盖情况:%s\n", arr + 2);
printf("正常情况:%s\n", arr1);
return 0;
}
运行结果:
二、memcpy
void *memcpy( void *dest, const void *src, size_t count );
memcpy函数将src的count字节复制到dest。
如果源和目标重叠,此函数不能确保在覆盖之前复制重叠区域中的原始源字节。使用memmove处理重叠区域。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dst, const void* src, size_t count)
{
void* ret = dst;
assert(dst);
assert(src);
while(count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
char dst[] = "abcdefghigk";
char src[] = "hello world";
void* ret = my_memcpy(dst, src, 8);
printf("%s\n", (char*)ret);
return 0;
}
运行结果:
三、 strstr
char* strstr( const char* str1, const char* str2 );
在一个字符串中找子字符串
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
char* cp = (char*)str1;
char* substr = (char*)str2;
char* s1 = NULL;
if (*str2 == '\0')
return NULL;
while (*cp)
{
s1 = cp;
substr = str2;
while (*s1 && *substr && (*s1 == *substr))
{
s1++;
substr++;
}
if (*substr == '\0')
return cp;
cp++;
}
}
int main()
{
char str1[] = "abcdefghi";
char str2[] = "bcd";
char* ret = my_strstr(str1, str2);//在arr1中找arr2字符串第一次出现的位置
if (ret != NULL)
printf("%s\n", ret);
else
printf("找不到字符串\n");
return 0;
}
运行结果:
四、strcat
char* strcat( char* dest, const char* src );
追加字符串
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest);
assert(src);
char* ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char dest[20] = "hello ";
char src[] = "world";
strcat(dest, src);
printf("%s\n", dest);
return 0;
}
运行结果:
五、strcmp
int strcmp (const char* src, const char* dest);
字符串的比较
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* src, const char* dest)
{
assert(src);
assert(dest);
int ret = 0;
while (!(ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest)
++src, ++dest;
if (ret < 0)
ret = -1;
else if (ret > 0)
ret = 1;
return ret;
}
int main()
{
char src[] = "hello";
char dest[] = "world";
int ret = my_strcmp(src, dest);
printf("%d\n", ret);
return 0;
}
运行结果:
六、strcpy
char* strcpy( char* Destination, const char* Source );
把含有’\0’结束符的字符串复制到另一个字符串中
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest);
assert(src);
char* ret = dest;
while (*dest++ == *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "****************";
char arr2[] = "hello";
char* ret = my_strcpy(arr1, arr2);
printf("%s\n", ret);
return 0;
}
运行结果:
七、strlen
size_t strlen ( const char* str );
计算指定字符串的长度
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char* str = "abcdef";
printf("%d\n", my_strlen(str));
return 0;
}
运行结果: