1.memcpy的实现
上面是官网的定义
将num字节的值从src指向的位置直接复制到dest指向的存储块。
有三个参数
destination(dest):指向要复制内容的目标数组的指针,将其类型转换为void *类型的指针。
source(src):指向要复制的数据源的指针,类型转换为const void *类型的指针。
num:要拷贝多少。
实现如下
#include<stdio.h>
#include<string.h>
#include<assert.h>
void M_Memcpy(char* dest, const char* src, int n) {
char* pdest = dest;
const char* psrc = src;
assert(dest);
assert(src);
while (n--) {
*pdest = *psrc;
pdest++;
psrc++;
}
}
int main() {
char arr1[] = "hello world ! ";
char arr2[30];
M_Memcpy(arr2, arr1, strlen(arr1) + 1); //+1可将' \0' 拷贝给arr2
printf("arr2数组元素为:%s\n", arr2);
system("pause");
return 0;
}
2.memmove
将num字节的值从src指向的位置复制到dest指向的存储块。
思考:char是1字节,先要将void*的转换成char*才能进行拷贝
1.dest<=src,源内存的首地址大于目标内存的首地址,进行正向拷贝
2.dest>=src+n,目标内存的首地址大于源内存的首地址+n,进行反向拷贝
3.dest<src+n,目标内存的首地址小于源内存的首地址+n,此时随着src向dest拷贝,会数据丢失,因此需要扩容,将两个指针同时增加n
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *M_Memmove(void *dest, const void *src, int n) {
char* pdest = (char*)dest;
const char* psrc = (const char*)src;
assert(dest);
assert(src);
if ((pdest <= psrc) && (pdest >= psrc + n)) {
while (n--) {
*pdest = *psrc;
}
}
else
{
while (n--)
{
*(pdest + n) = *(psrc + n);
}
}
return dest;
}
int main() {
char arr[10] = "abcdef";
char arr1[10] = "abcdef";
char arr2[10] = { 0 };
M_Memmove(arr + 2, arr, 4);
M_Memmove(arr2, arr1, 4);
printf("内存覆盖情况:%s\n", arr + 2);
printf("正常情况:%s\n", arr1);
system("pause");
return 0;
}
3.strcmp
1)比较两个字符串是不是同一个字符
2)比较两个字符串的内容是不是一样
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<assert.h>
int M_strcmp(const char* str1, const char* str2) {
assert(*str1 != '\0' && * str2 != '\0');
while (*str1 != '\0' && * str2 != '\0')
{
if (*str1 < *str2) {
return -1;
}
else if (*str1 > *str2) {
return 1;
}
else
{
str1++;
str2++;
}
}
if (*str1 < *str2) {
return -1;
}
else if (*str1 > *str2) {
return 1;
}
else
{
return 0;
}
}
int main(void)
{
char str1[] = "haha";
char str2[] = "haha";
int ret = M_strcmp(str1, str2);
printf("%d\n", ret);
system("pause");
return 0;
}
4.strstr
返回指向str1中第一次出现的str2的指针,如果str2不属于str1,则返回空指针。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<assert.h>
char* M_Strstr(const char* str, const char* dest) {
assert(str);
assert(dest);
const char* pstr = str;//源串 需要遍历原串
const char* start = str;// 返回匹配成功的位置
const char* pdest = dest;//子串
while (*start != '\0')
{
pstr = start;
pdest = dest;
while ((*pdest != '\0') && (*pstr != '\0'))
{
if (*pstr == *pdest) {
pstr++;
pdest++;
}
else
{
break;
}
}
if (*pdest == '\0') {
return start;
}
if (*pstr == '\0') {
return NULL;
}
start++;//匹配不成功,下一个位置开始再次尝试
}
return NULL;
}
int main()
{
char str1[] = "ashbeuhba";
char str2[] = "hba";
char* p;
p = M_Strstr(str1, str2);
printf("%s", p);
system("pause");
return 0;
}