今天我们来了解下字符串函数和内存函数的实现。
目录
(一)字符串函数
(1)strlen
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* pc)
{
assert(pc);
int count = 0;
while ((*pc) != '\0')
{
count++;
pc++;
}
return count;
}
int main()
{
char arr[] = "l love you 3000!";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
(2)strcpy
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* str1, const char* str2)
{
char* dest = str1;
assert(str1 != NULL);
assert(str2 != NULL);
while (*dest++ = *str2++)
{
;
}
return str1;
}
int main()
{
char arr1[] = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
char arr2[] = "I love you 3000!";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
(3)strcat
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* source)
{
assert(dest && source);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *source++)
{
;
}
return ret;
}
int main()
{
char arr[20] = "Hello ";
my_strcat(arr, "world");
puts(arr);
return 0;
}
(4)strcmp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* ch1, const char* ch2)
{
assert(ch1 && ch2);
while (*ch1 == *ch2)
{
if (*ch1 == 0)
return 0;
ch1++;
ch2++;
}
return (*ch1 - *ch2);
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abcde";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
printf(">\n");
else if (ret == 0)
printf("=\n");
else
printf("<\n");
return 0;
}
(5)strncpy
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strncpy(char* destination, const char* source, size_t num)
{
assert(destination && source);
char* ret = destination;
while (num--)
{
*destination = *source;
destination++;
source++;
}
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[10] = "xxxxxxxxx";
my_strncpy(arr2, arr1, 5);
puts(arr2);
return 0;
}
(6)strncat
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strncat(char* destination, const char* source, size_t num)
{
assert(destination && source);
char* ret = destination;
while (*destination != 0)
{
destination++;
}
while (num--)
{
*destination = *source;
destination++;
source++;
}
*++destination = '\0';
return ret;
}
int main()
{
char arr1[10] = "abc";
char arr2[] = "defgh";
my_strncat(arr1, arr2, 4);
puts(arr1);
return 0;
}
(二)内存函数
(1)memcpy
#define _CRT_SECURE_NO_WARNINGS
#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 + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 40);
printf("arr2:");
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
(2)memmove
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest && src);
void* ret = dest;
if (dest < src)
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (count--)
{
*((char*)dest - count) = *((char*)src - count);
}
}
return ret;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
memcpy(arr, arr + 2, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}