模拟實作strlen(字元串長度)
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str)
{
int count = 0;
assert(str != NULL);
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdefgh";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
模拟實作strcpy(字元串拷貝)
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "abcdefh";
char arr2[] = "xyz";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
模拟實作strcmp(字元串比較)
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else
return -1;
}
int main()
{
char* p1 = "abc";
char* p2 = "xyz";
int ret = my_strcmp(p1, p2);
printf("ret = %d\n", ret);
return 0;
}
模拟實作strcat(字元串追加)
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[10] = "abc";
char arr2[] = "xyz";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
模拟實作strstr(查找字元串)
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* p1, const char* p2)
{
assert(p1 != NULL);
assert(p2 != NULL);
char *s1 = NULL;
char *s2 = NULL;
char *cur = (char*)p1;
if (*p2 == '\0')
{
return (char*)p1;
}
while (*cur)
{
s1 = cur;//目前位址
s2 = (char*)p2;
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;//找到子串
}
cur++;
}
return NULL;//找不到子串
}
int main()
{
char *p1 = "abcdef";
char *p2 = "def";
char* ret = my_strstr(p1, p2);
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
模拟實作memcpy(記憶體拷貝)
#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (num--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
int main()
{
int arr1[] = { 1, 2, 3, 4, 5 };
int arr2[5] = { 0 };
int i = 0;
my_memcpy(arr2, arr1, sizeof(arr1));
for (i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
模拟實作memmove(記憶體移動)
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
void * ret = dest;
assert(dest != NULL);
assert(src != NULL);
if (dest <= src || (char *)dest >= ((char *)src + num))
{
while (num--)
{
*(char *)dest = *(char *)src;
dest = (char *)dest + 1;
src = (char *)src + 1;
}
}
else
{
dest = (char *)dest + num - 1;
src = (char *)src + num - 1;
while (num--)
{
*(char *)dest = *(char *)src;
dest = (char *)dest - 1;
src = (char *)src - 1;
}
}
return ret;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i = 0;
my_memmove(arr + 2, arr, 20);
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}