總結:模拟實作常用的字元串類函數(strlen、strcpy、strcmp……..)
1. strlen
2. strcpy
3. strcat
4. strstr
5. strchr
6. strcmp
7. memcpy
8. memmove
1.strlen有3種方法實作:
a.計數器實作
代碼如下:
#include <stdio.h>
int my_strlen(const char* str)
{
int count = ;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
int ret = ;
char* arr = "hello world";
ret = my_strlen(arr);
printf("%d\n", ret);
return ;
}
運作結果:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9s2RiZWOxoVd5ckYxw2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TM5MTNyADNzIDOycDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
b.遞歸實作
代碼如下:
#include "stdio.h"
int my_strlen(const char* arr)
{
if (*arr == '\0')
{
return ;
}
else
{
return + my_strlen(arr + );
}
}
int main()
{
int ret = ;
char* arr = "hello world";
ret = my_strlen(arr);
printf("%d\n", ret);
return ;
}
運作結果:
c.指針實作
程式如下:
#include "stdio.h"
int my_strlen( char* arr)
{
char* p = arr;
while (*arr)
{
arr++;
}
return arr - p;
}
int main()
{
int ret = ;
char* arr = "hello world";
ret = my_strlen(arr);
printf("%d\n", ret);
return ;
}
運作結果:
2.strcpy
代碼如下:
#include <assert.h>
#include <stdio.h>
char* my_strcpy(char* dest, const char*src)
{
char* ret = dest;
assert(dest&&src);
while ((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[];
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return ;
}
運作結果:
3.strcat
代碼如下:
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest&&src);
while (*dest)
{
dest++;
}
while ((*dest++=*src++))
{
;
}
return ret;
}
int main()
{
char arr1[] = "welcome to bite";
char arr2[] = "my baby ";
my_strcat(arr2, arr1);
printf("%s\n", arr2);
return ;
}
運作結果:
4.strstr
代碼如下:
#include<stdio.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str2&&str1);
char* p1 = (char*)str1;
char* p2 = (char*)str2;
char *s1 = NULL;
if (*str2 == '\0')
return NULL;
while (*p1)
{
s1 = p1;
p2 = (char*)str2;
while (*s1&&*p2 && (*s1==*p2))
{
s1++;
p2++;
}
if (*p2 == '\0')
{
return p1;
}
p1++;
}
rturn NULL;
}
int main()
{
char arr1[] = "abbbcdef";
char arr2[] = "bbcd";
char* ret=my_strstr(arr1, arr2);
printf("%s\n", ret);
return ;
}
運作結果:
5.strchr
代碼如下:
#include<stdio.h>
#include <assert.h>
char* my_strchr(const char* dest, char c)
{
assert(dest!=NULL);
char* p = (char*)dest;
if (*p == '\0')
{
return NULL;
}
while (*p)
{
if (*p==c)
{
return p;
}
p++;
}
}
int main()
{
char arr[] = "abcfcfac";
char c = 'f';
char* ret = my_strchr(arr, c);
printf("%s\n", ret);
return ;
}
運作結果:
6.strcmp
代碼如下:
#include<stdio.h>
#include <assert.h>
int my_strcmp(const char* dest, const char* src)
{
assert(dest&&src);
while ((*dest == *src) && *dest&&*src)
{
if ((*dest=='\0')||(*src=='\0'))
{
return ;
}
dest++;
src++;
}
if (*dest>*src)
{
return ;
}
else
return -;
}
int main()
{
char arr1[] = "dfgy";
char arr2[] = "gygyy";
int ret =my_strcmp(arr1, arr2);
printf("%d\n", ret);
return ;
}
運作結果:
7.memcpy
記憶體拷貝,和strcpy相比,速度更快。
代碼如下:
#include<stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest&&src);
void* ret=dest;
while (count)
{
*(char*)dest = *(char*)src;
dest = (char*)dest+;
src = (char*)src + ;
count--;
}
return ret;
}
int main()
{
char arr1[];
char arr2[] = "abcdef";
my_memcpy(arr1, arr2, );
printf("%s\n", arr1);
return ;
}
運作結果;
memcpy運用中存在的缺陷,即memcpy不能拷貝目的位址(dest)和源位址(src)記憶體空間有重合的部分,更為确切的說應該是當目的位址大于源位址的時候,不能夠有重合部分,否則源位址重合部分資料會發生錯誤。
比如:
#include<stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest&&src);
void* ret = dest;
while (count)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + ;
src = (char*)src + ;
count--;
}
return ret;
}
int main()
{
int arr[] = { , , , , , , , , , };
int i = ;
my_memcpy(arr + , arr + , );
for (i = ; i < ; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return ;
}
運作結果:
顯而易見,當我想把數組1 2 3 4 5 6 7 8 9 10中3 4 5 6拷貝到5 6 7 8的位置時,由于出現重疊,是以拷貝失敗。
8.memmove
他就能完美的解絕memcpy中的缺陷
代碼如下:
#include<stdio.h>
#include <assert.h>
void* my_memmove(void* dest, void const * src, size_t count)
{
assert(dest&&src);
char* p1 = (char*)dest;
char* p2 = (char*)src;
if ((p1 > p2) && (p1 < p2 + count))
{
while (count--)
{
*(p1 +count)= *(p2+count);
}
}
else
{
while (count--)
{
*p1++ = *p2++;
}
}
return dest;
}
int main()
{
int arr[] = { , , , , , , , , , };
int i = ;
my_memmove(arr+, arr+, );
for (i = ; i < ;i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return ;
}
運作結果:
很明顯我成功把3456拷貝到5678的位置。