1,模拟实现 strcpy 一般形式为 strcpy(字符数组1,字符串2),它表示“字符串的复制函数”,作用是将字符串2复制到字符数组1中去。
#include <stdio.h>
#include <assert.h>
#include <string.h>
char *my_strcpy(char *dest, const char *src)
{
char *ret = dest;
assert((dest != NULL)&&(src != NULL));
while(*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr[10];
printf("%s\n",my_strcpy(arr,"Hello!"));
system("pause");
return 0;
}
2,
模拟实现
strcat 一般形式为 strcat(字符数组1,字符数组2),作用是吧两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面去,结果放在字符数组1中;
#include<stdio.h>
#include <assert.h>
char *my_strcat(char *dest, const char *str)
{
char *ret = dest;
assert((dest != NULL)&&(str != NULL));
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *str++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "Hello ";
char arr2[] = "bit";
printf("%s\n",my_strcat(arr1,arr2));
system("pause");
return 0;
}
3,
模拟实现
strcmp 一般形式为 strcmp(字符串1,字符串2),它的作用是比较字符串1和字符串2 ;
(1)如果字符串1=字符串2,则函数值为0 ; (2) 如果字符串1>字符串2,则返回一个正数; (3)字符串1<字符串2 返回负数;
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char *dest, const char *str)
{
assert((dest != NULL)&&(str != NULL));
while (*dest == *str)
{
if (*dest == '\0')
return 0; // 两个字符串相同;
dest++;
str++;
}
if ((*dest - *str) > 0)
{
return 1; // arr1 大
}
else
return -1; // arr2 大
}
int main()
{
char arr1[] = "ABCDEF";
char arr2[] = "ABCDBE";
int ret = 0;
ret = my_strcmp(arr1,arr2);
printf("%d\n",ret);
system("pause");
return 0;
}
4, 模拟实现 strstr 一般形式为 strstr(字符串,字串) 作用是 用来检索子串在字符串中首次出现的位置;
#include<stdio.h>
#include <assert.h>
char *my_strstr(const char *str, const char *substr)
{
char *cur = str;
char *str1 = NULL;
char *str2 = NULL;
if (*substr == '\0')
{
return str;
}
while (*cur)
{
str1 = cur;
str2 = substr;
while ((*str2)&&(*str1 == *str2))
{
str1++;
str2++;
}
if (*str2 == '\0')
{
return cur;
}
cur++;
}
return NULL;
}
int main()
{
char arr1[] = "abbbbcd";
char arr2[] = "bbcd";
printf("%s\n",my_strstr(arr1,arr2));
system("pause");
return 0;
}
5, 模拟实现 memcpy 一般形式为 memcpy(字符串1,字符串2,n) 作用是 讲字符串2中的前n个字符复制到字符串1中去,其余的位置仍然放字符串1的其他字符
#include <stdio.h>
void *my_memcpy(void *dest, void *src, int n)
{
char *pdest = (char*)dest;
char *psrc = (char*)src;
while (n)
{
*pdest++ = *psrc++;
n--;
}
return dest;
}
int main()
{
char arr1[] = "ABCDEF";
char arr2[] = "QWER";
int k = 3;
printf("%s\n",my_memcpy(arr1,arr2,k));
system("pause");
return 0;
}
6, 模拟实现 memmove 作用是字符串中的字符复制解决重叠的问题
#include <stdio.h>
#include <assert.h>
void *my_memmove(void *dest, void *src, int n)
{
char *pdest = (char*)dest;
char *psrc = (char*)src;
assert((dest != NULL)&&(src != NULL));
if ((pdest >= psrc)&&(pdest <= psrc+n))
{
while (n)
{
*(pdest+n-1) = *(psrc+n-1);
n--;
}
}
else
{
while (n)
{
*pdest++ = *psrc++;
n--;
}
}
return dest;
}
int main()
{
char arr1[] = "ABCDEF";
my_memmove(arr1+1,arr1,3*sizeof(char));
printf("%s\n",arr1);
system("pause");
return 0;
}
7, 模拟实现 strlen(三种方式) 计算字符个数
#include <stdio.h>
//int my_strlen(const char *p) //计数器算法;
//{
// int count = 0;
// while (*p)
// {
// count++;
// p++;
// }
// return count;
//}
//int my_strlen(const char *p) //递归
//{
// if (*p == '\0')
// {
// return 0;
// }
// else
// return 1 + my_strlen(p+1);
//}
int my_strlen(const char *p) //指针算法
{
const char *start = p; //首地址
while(*p)
{
p++;
}
return p - start; //首尾相减
}
int main()
{
char arr1[] = "ABCDEF";
int ret = my_strlen(arr1);
printf("%d\n",ret);
system("pause");
return 0;
}