递归模拟strlen
#include<assert.h>
size_t mock_strlen(const char*arr)
{
assert(arr != NULL);
if(*arr!='\0')
{
return mock_strlen(arr+1) + 1;
}
else
{
return 0;
}
}
int main()
{
char arr[] = "how are you";
printf("%d\n", mock_strlen(arr));
return 0;
}
指针-指针模拟strlen
#include<assert.h>
size_t mock_poin_strlen(const arr)
{
assert(arr!=NULL);
char* a = arr;
while (*a++!='\0')
{
}
return a - arr;
}
int main()
{
char arr[] = "how are you";
printf("%d\n",mock_poin_strlen(arr));
return 0;
}
模拟strcpy
#include<assert.h>
void Get(char* arr1, const char* arr2);
int main()
{
char arr[] = "hanshtretwtu";
char arr1[] = "HELLWODE";
Get(arr, arr1);
printf("%s\n", arr);
return 0;
}
void Get(char* arr1, const char* arr2) {
char*ele_add=arr1;
assert(arr1&&arr2);
while (*arr1++ = *arr2++) {//结果赋值’\0‘时为假,停止
}
return ele_add;
}
模拟strncpy
char* mock_strncpy(char*pa1,char*pa2,int a)
{
char* s = pa1;
while (a && (*pa1++ = *pa2++) != '\0')
{
a--;
}
if (a)
while (--a)
*pa1++ = '\0';
return s;
}
int main()
{
int a = 5;
char arr[] = "hehehehe";
char arr1[] = "aaa";
printf("%s\n",mock_strncpy(arr, arr1, a));
return 0;
}
模拟strcat
#include<assert.h>
char* mock_strcat(char* pa1, const char* pa2)
{
char* store = pa1;
assert(pa1 != NULL);
assert(pa2 != NULL);
//或者assert(pa1 && pa2);
while (*pa1 != '\0')//while(*pa1)也行,如果结果'0',ASCII=0;假
{
pa1++;
}
while (*pa1++ = *pa2++)
{
}
return store;
}
int main()
{
char arr[30] = "Hell world ";
char arr1[] = "chenekg";
printf("%s\n", mock_strcat(arr, arr1));
return 0;
}
模拟strncat
#include<assert.h>
char* mock_strcat(char* pa1, const char* pa2,int i)
{
char* store = pa1;
assert(pa1 != NULL);
assert(pa2 != NULL);
//或者assert(pa1 && pa2);
while (*pa1 != '\0')//while(*pa1)也行,如果结果'0',ASCII=0;假
{
pa1++;
}
while ( i && (* pa1++ = *pa2++))
{
i--;
}
/*if (i==0)
{
*(pa1++) = '\0';
}*/
return store;
}
int main()
{
int i = 6;
char arr[30] = "Hell world ";//自动填补\0
char arr1[] = "chenekg";
printf("%s\n", mock_strcat(arr, arr1,i));
return 0;
}
模拟strcmp
int mock_strcmp(const char* pa1, const char* pa2)
{
assert(pa1&&pa2);
while (*pa1 == *pa2)
{
if (*pa1 == '\0')
{
return 0;
}
pa1++;
pa2++;
}
return *pa1-*pa2;
}
int main()
{
char arr1[] = "habc";
char arr2[] = "habc";
if (mock_strcmp(arr1, arr2)>0)
{
printf("arr1>arr2\n");
}
else if(mock_strcmp(arr1, arr2) <0)
{
printf("arr1<arr2\n");
}
else
{
printf("arr1=arr2\n");
}
return 0;
}
标准库函数(固定返回1,0,-1)
int mock_strcmp(const char* pa1, const char* pa2)
{
int ret = 0;
while (ret=*(unsigned char*)pa1-*(unsigned char*)pa2==0&&*pa2)
{
pa1++;
pa2++;
}
return (ret > 0) - ((-ret) > 0);
}
模拟strcmp
基础上加个控制条件
模拟strstr
#include<assert.h>
char* mock_strstr(const char* pa1, const char* pa2)
{
assert(pa1 && pa2);
while (*pa1)
{
const char* pa3 = pa1;
const char* pa4 = pa2;
while (*pa3 && (*pa3 == *pa4))
{
pa3++;
pa4++;
}
if (*pa4 == '\0') {
return pa1;
//如果我要返回pa3;应该写成:return (char*)pa3;//因为pa3是const char*;应该转成char*返回
}
pa1++;
}
return NULL;
}
int main()
{
char arr1[] = "abcdabcdabcd";
char arr2[] = "cdab";
printf("%s\n",mock_strstr(arr1, arr2));
return 0;
}