字符串模拟实现

1.三种方式模拟实现strlen函数。

 方法1:用计数器模拟实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Assert.h>
int mystrlen( char* str)
{
  assert(str);
int ret = 0;
while (*str != '\0')
{
ret++;
str++;
}
return ret;
}
int main()
{
char arr[] = {" "};
printf("请输入字符串\n");
scanf("%s", arr);
printf("%s的长度是%d\n", arr, mystrlen(arr));
system("pause");
return 0;
}
方法2:用函数递归的方法模拟实现
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Assert.h>
int my_strlen( char* str)
{
assert(str);
if (*str == '\0')
{
return 0;
}
else
return 1 + my_strlen(str+1);
}
int main()
{
char arr[] = { " " };
printf("请输入字符串\n");
scanf("%s", arr);
printf("%s的长度是%d\n", arr, my_strlen(arr));
system("pause");
return 0;
}

//方法3:用指针减指针的方法模拟实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

#include<stdlib.h>

#include<string.h>
#include<Assert.h>
int MY_strlen(char* str)
{
assert(str);
char* p = str;
while (*str != '\0')
{
str++;
}
return str - p;
}
int main()
{
char arr[] = { " " };
printf("请输入字符串\n");
scanf("%s", arr);
printf("%s的长度是%d\n", arr, MY_strlen(arr));
system("pause");
return 0;
}
2.模拟实现strcpy 

//方法1:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Assert.h>
char* mystrcpy(char* dest,const char* src)
{
assert(dest!=NULL);
assert(src!=NULL);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20];
char* arr2 = "abcdef";
printf("%s\n", mystrcpy(arr1, arr2));
system("pause");
return 0;
}


//方法2
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Assert.h>
char *mystrncpy(char *dest, const char* src, size_t n)//将src中n个字符拷贝到dest
{
assert(dest != NULL);
assert(src != NULL);
char*ret = dest;
while (n)         //复制n个字符,循环n次  
{
*dest++ = *src++;
n--;
}
if (*(dest - 1) != '\0')//判断是否已经将‘\0’复制到目标字符串中  
*dest = '\0';      //若没有则给目标字符串最后添加‘\0’   
return ret;
}
int main()
{
char arr1[20];
char* arr2=  "abcdef";
printf("%s\n",  mystrncpy(arr1,arr2,3));
system("pause");
return 0;
}
//

//方法3:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Assert.h>
char* mystrcpy(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
while (*src != '\0')
{
*dest = *src;
src++;
dest++;
}
*dest ='\0';
//给目标字符串最后添加‘\0’  
return ret;
}
int main()
{
char arr1[20];
char* arr2 = "abcdef";
printf("%s\n", mystrcpy(arr1, arr2));
system("pause");
return 0;
}


3.模拟实现strcat 

#define _CRT_SECURE_NO_WARNINGS 1  
#include<stdio.h>

#include<stdlib.h>
#include<stdlib.h>
#include<Assert.h>
char* mystrcat(char* str1, char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
char* ret = str1;
while (*str1!='\0')
{
str1++;
}
while (*str1++ =*str2++)
{
;
}
return ret;
}
int main()
{
char arr1[10] = {"abcde"};
char arr2[] = "fgh";
printf("%s\n", mystrcat(arr1, arr2));
system("pause");
return 0;
}

4.模拟实现strcmp 

//方法1:
#define _CRT_SECURE_NO_WARNINGS 1  
#include<stdio.h>
#include<stdlib.h>
#include<Assert.h>
int mystrcmp(const char* str1,const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 != 0 && *str2 != 0)
{
if (*str1 > *str2||*str1<*str2)
{
return *str1 - *str2;
}
str1++;
str2++;
}
if ((*str1 == '\0'&&*str2 != '\0') || (*str1 != '\0'&&*str2 == '\0'))
{
return *str1 - *str2;
}
else
return 0;
}
int main()
{
char *arr1 = "abcdef";
char *arr2 = "abcdefg";
int ret = mystrcmp(arr1, arr2);
if (ret == 0)
{
printf("大小一样\n");
}
else if (ret > 0)
{
printf("arr1比arr2大\n");
}
else
{
printf("arr1比arr2小\n");
}
system("pause");
return 0;
}

方法2:

#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 != NULL);
assert(str2 != NULL);
int ret = 0;
while (!(ret= *(unsigned char*)str1 - *(unsigned char*)str2) && *str2)
{
++str1;
++str2;
}
if (ret < 0)
{
ret = -1;


}
else if (ret<0)
{
ret = 1;
}
return ret;
}
int main()
{
char *arr1 = "abcd";
char *arr2 = "abcdf";
int ret = My_strcmp(arr1, arr2);
if (ret == 0)
{
printf("大小一样\n");
}
else if (ret ==1)
{
printf("arr1比arr2大\n");
}
else
{
printf("arr1比arr2小\n");
}
system("pause");
return 0;
}

5.模拟实现strstr 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char * my_strstr(const char * str1, const char *str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
char* cp = (char* )str1;
char* substr = (char* )str2;
char* s1 = NULL;
if (substr == '\0')
{
return NULL;
}
while (*cp)
{
s1 = cp;
substr = str2;
while (*s1&&*substr && (*s1 == *substr))
{
s1++;
substr++;
}
if (*substr == '\0')
{
return cp;
}
cp++;
}
return NULL;
}
int main()
{
char arr1[]  = "abbbbcdef";
char arr2[]  = "bb";
char* p = my_strstr(arr1, arr2);
if (p!= NULL)
{
printf("找到了%s!\n",p);
}
else
{
printf("没有找到!\n");
}
system("pause");
return 0;
}

6.模拟实现memcpy 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
void *ret = dest;
while (count--)
{
(char*)dest = (char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;


}
int main()
{
int str1[] = { 1, 2, 3, 4, 5 };
int str2[] = { 0 };
char* p = (char*)my_memcpy(str2, str1, 5);
for (int i = 0; i < sizeof(str1) / sizeof(str1[0]); i++)
{
printf("%d ", str1[i]);
}
printf("\n");
system("pause");
return 0;
}

7.模拟实现memmove 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void * my_memove(void* dest, void* src, size_t count)
{
assert(dest != NULL);
assert(src != NULL);
void * ret = dest;
if (dest <= src || (char*)dest >= ((char*)src + count))//从前向后拷贝
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else                       //从后向前拷贝
{
dest = (char*)dest + count-1;
src = (char*)src + count-1;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest- 1;
src = (char*)src - 1;
}
}
return ret;
}
int main()
{
//int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
char arr1[] = "abcdefgh";
int i = 0;
int sz = sizeof(arr1) / sizeof(arr1[0]);
//my_memove(arr1 + 2, arr1 + 1, 4 * sizeof(int));
my_memove(arr1 + 2, arr1 + 1, 4 * sizeof(char));
printf("%s", arr1);
/*for (i = 0; i<sz; i++)
{
printf("%d",arr1[i]);
}*/
printf("\n");
system("pause");
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值