1.memcpy函数
memcpy函数与strncpy不同的是memcpy可以对整形数组进行拷贝而strncpy只能对字符数组拷贝。
下面实现将“7,8,9”取代arr1中的“0,1,2”。
void*my_memcpy(void* str1, const void* str2, size_t num)
{
void* ret = str1;
assert(str1 && str2);
while (num--)
{
*(char*)str1 = *(char*)str2;
str1 = (char*)str1 + 1;
str2 = (char*)str2 + 1;
}
return ret;
}
int main()
{
int arr1[] = { 0,1,2,3,4,5,6 };
int arr2[] = { 7,8,9,10 };
my_memcpy(arr1, arr2,3*sizeof(int));
for (int i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
因为memcpy数组是以字节为单位拷贝的所以函数中要将它强制转化为字符类型,字符的单位为字节。
2.strncat函数
它与strcat函数类型差不多只是多了可以加拷贝的个数所以它的参数为三个。
下面实现将“world!”追加到arr1数组后面。
char* my_strncat(char* str1, const char* str2, size_t num)
{
assert(str1 && str2);
while (*str1)
{
str1++;
}
while (num--)
{
*str1++ = *str2++;
}
*str1 = '\0';
return str1;
}
int main()
{
char arr1[100] = "hello ";
char arr2[] = "world! and hello offers!";
char* n = my_strncat(arr1, arr2, 6);
printf("%s\n", arr1);
return 0;
}
3.strncpy函数的实现
strncpy与strcpy类型差不多,都属于拷贝字符串的,但strncpy可以拷贝任意个数的字符串,所以strncpy有三个参数。
下面是实现将arr2中的“he”拷贝到arr1上
char*my_strncpy(char* str1, const char* str2, size_t num)
{
int i = 0;
for (i = 0; str2[i] != '\0' && i < num; i++)
{
str1[i] = str2[i];
}
if (i < num)
{
str1[i] = '\0';
}
return str1;
}
int main()
{
char arr1[100] = { 0 };
char arr2[] = "hello world!";
char *n=my_strncpy(arr1, arr2, 2 );
printf("%s\n", arr1);
return 0;
}
其中可以用指针代替数组的形式
4.memmove函数
memmove函数用来实现两个或者一个整形字符的拷贝与strncpy不同与strncpy只能拷贝字符串
下面是实现自己拷贝自己从arr[2]中为起始位置拷贝1,2,3,4,5,其中单位为字节
void* my_memmove(void* dest, void* src, size_t num)
{
if (dest > src)
{
while (num--)
{
*(char*)dest = *(char*)src;
dest=(char*)dest+1;
src=(char*)src+1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 5 * sizeof(int));
return 0;
}
5.strstr函数
strstr为string string是在一个字符串中寻找另外一个字符串,如果寻找的字符串为空字符串则返回原字符串。
下面是实现在arr1中寻找arr2
const char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = str1;
const char* s2 = str2;
const char* cur = str1;
if (*str2 =='\0')
{
return str1;
}
while (*cur) //cur是来找字符的每次找完结尾都加一
{
s1 = cur;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;
}
cur++;
}
return NULL;
}
int main()
{
char arr1[] = "abbbcde";
char arr2[] = "bbc";
const char *n = my_strstr(arr1, arr2);
if (n == NULL)
{
printf("没找到");
}
else
{
printf("找到了,%s\n", n);
}
return 0;
}