1.模拟实现strcpy函数的功能
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strcpy(char *dst,char const *src)
{
char *ret = dst;
assert(dst);
assert(src);
while (*dst++ = *src++);
return ret;
}
int main()
{
char *msg = "hello world";
char str[20] = {0};
printf("%s \n",my_strcpy(str,msg));
system("pause");
return 0;
}
2.实现strncpy函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strncpy(char *dst,char const *src,int n)
{
char *ret = dst;
assert(dst);
assert(src);
//如果拷贝的字符串长度小于源字符串的长度,则将会输出一个不合法的字符串,可能会输出乱码
while (n-- && *src != '\0' )
{
*dst++ = *src++;
}
//如果拷贝的长度小于源字符串的长度
if (n != 0)
{
while (n--)
{
*dst = '\0';//应该将dst剩余的空间内容置为'\0'
}
}
return ret;
}
int main()
{
char *msg = "hello world";
char str[20] ;
int num = 0;
printf("Please Enter your number of copy:>");
scanf("%d",&num);
printf("%s \n",my_strncpy(str,msg,num));
system("pause");
return 0;
}
当拷贝的字符串长度小于源字符串的长度时,输出结果如下:
3.实现strcat函数的功能:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
char *my_strcat(char *dst,char const *src)
{
char *dst_end = dst + strlen(dst) ;
char *ret = dst_end;
assert(dst);
assert(src);
while (*dst_end++ = *src++);
return dst;
}
int main()
{
char dst[40] = "I love ";
char *src = " my nation";
printf("%s\n",my_strcat(dst,src));
system("pause");
return 0;
}
4.实现strncat函数的功能
#pragma warning(disable : 4996)
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
char *my_strncat(char *dst,const char *src,int n)
{
assert(dst);
assert(src);
char *dst_end = dst + strlen(dst);
while ((*src != '\0') && (n--))
{
*dst_end++ = *src++;
}
*dst_end = '\0';
return dst;
}
int main()
{
char *src = "world";
char dst[32] = "hello";
my_strncat(dst,src,29);
printf("%s \n",dst);
system("pause");
return 0;
}
5.实现strcmp函数
第一种方法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strcmp(char const *str1,char const *str2)
{
assert(str1);
assert(str2);
while (*str1 != '\0' && *str2 != '\0')//判断字符串中对应字符的大小
{
if(*str1 > *str2)
{
return 1;//str1大于str2中的字符,返回1
}
else if(*str1 < *str2)
{
return -1;//str1小于str2中的字符,返回-1
}
else
{
str1++,str2++;//对应的字符相等,则比较下一个字符
}
}
if (*str1 == '\0' && *str2 != '\0')
{
return -1;
}
else if(*str1 != '\0' && *str2 == '\0')
{
return 1;
}
else
return 0;
}
int main()
{
char *str1 = "hello world";
char *str2 = "hello world";
printf("%d\n",my_strcmp(str1,str2));
system("pause");
return 0;
}
第二种方法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strcmp(const char *str1,const char *str2)
{
assert(str1);
assert(str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
}
return *str1 - *str2;
}
int main()
{
const char *str1 = "bcdefg";
const char *str2 = "abcdefg";
int ret = my_strcmp(str1,str2);
if (ret > 0)
{
printf("str1 > str2\n");
}
else if(ret < 0)
{
printf("str1 < str2\n");
}
else
{
printf("str1 = str2\n");
}
system("pause");
return 0;
}
6.实现strncmp函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strncmp(const char *str1,const char *str2,int n)
{
assert(str1);
assert(str2);
while (n-- && (*str1 == *str2))
{
if (*str1 == '\0')
{
return 0;
}
str1++,str2++;
}
return *str1 - *str2;
}
int main()
{
char *str1 = "abs";
char *str2 = "absb";
int ret = my_strncmp(str1,str2,5);
printf("%d \n",ret);
system("pause");
return 0;
}
7.实现memcpy函数的实现
(标准规定:两块空间之间没有关联,简单的说,就是两块空间没有重叠)
第一种方法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void *my_memcpy(void *dst,void const *src,int 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 dest[40] = "this is a game";
char *src = "hello";
char *ret = (char *)my_memcpy(dest,src,sizeof(char) * strlen (src));
printf("%s\n",ret);
system("pause");
return 0;
}
第二种方法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void show(int *arr,int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void *my_memcpy(void *dst,void *src,int sz)
{
char *pdst = (char *)dst;
char *psrc = (char *)src;
assert(dst);
assert(src);
assert(sz > 0);
while (sz--)
{
*pdst++ = *psrc++;
}
return dst;
}
int main()
{
int arr1[] = {1,2,3,4,5,6,7,8,9,0};
int arr2[10];
int sz = sizeof(arr1);
my_memcpy(arr2,arr1,sz);
show(arr2,sz/sizeof(int));
system("pause");
return 0;
}
结果如下:
8.实现memmove函数的功能:
(这个函数与memcpy函数最大的不同是它考虑了拷贝的两块空间重叠的情况)
分析图示:
第一种方法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void *my_memmove(void *dst,void *src,int count)
{
char *_dst = (char *)dst;
char *ret = _dst;
char *_src = (char *)src;
char *_dst_end = _dst + count - 1;
char *_src_end = _src + count - 1;
assert(dst);
assert(src);
while (count--)
{
if (_src < _dst && _dst < _src_end + 1)//切记:_dst < _src_end + 1(需要减至'\0'的后面)
{
*_dst_end-- = *_src_end--;
}
else
{
*_dst++ = *_src++;
}
}
return ret;
}
int main()
{
char dst[34] = "hello";
int count = strlen(dst) + 1;
my_memmove(dst+1,dst,count);
printf("%s \n",dst);
system("pause");
return 0;
}
第二种方法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void show(int *arr,int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void *my_memmove(void *dst,void *src,int count)
{
char *pdst = (char *)dst;
char *psrc = (char *)src;
assert(dst);
assert(src);
assert(count > 0);
if (pdst > psrc && pdst < psrc + count)
{
while (count--)
{
*(pdst + count) = *(psrc + count);//注意:count一直在减1
}
}
else
{
while (count--)
{
*pdst++ = *psrc++;
}
}
return dst;
}
int main()
{
int arr1[10] = {1,2,3,4,5,6,7,8,9};
int sz = sizeof(arr1);
my_memmove(arr1+1,arr1,sz);
show(arr1,sz/sizeof(int));
system("pause");
return 0;
}
9.模拟实现memset函数:
调用memset函数后的结果:
模拟实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void show(int *arr,int sz)
{
int i = 0;
assert(arr);
for (i = 0; i < sz; i++)
{
printf("%x ",arr[i]);
}
printf("\n");
}
void *my_memset(void *dst,int c,int count)
{
assert(dst);
assert(count > 0);
while (count--)
{
*(char *)dst = 1;
dst = (char *)dst + 1;
}
}
int main()
{
int arr[10];
show(arr,sizeof(arr)/sizeof(int));
my_memset(arr,1,sizeof(arr));
show(arr,sizeof(arr)/sizeof(int));
system("pause");
return 0;
}