前言
本文将简单介绍 strlen, strcpy, strcat, strcmp, strncpy, strncat, strncmp, strtok, strstr, memcpy, memmove, memset, memcmp 的使用与实现
strlen
介绍
实现
//计数器法
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* arr)
{
assert(arr);
int i = 0;
while (*arr++)
{
i++;
}
return i;
}
int main()
{
char arr[30] = { 0 };
scanf("%s", arr);
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
//指针-指针
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* arr)
{
assert(arr);
const char * rember = arr;
while (*arr)
{
arr++;
}
return arr - rember;
}
int main()
{
char arr[30] = { 0 };
scanf("%s", arr);
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
//递归
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* arr)
{
assert(arr);
if (*arr != '\0')
{
return 1 + my_strlen(arr+1);
}
else
{
return 0;
}
}
int main()
{
char arr[30] = { 0 };
scanf("%s", arr);
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
strcpy
介绍
实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++);
return ret;
}
int main()
{
char arr1[] = "hello world";
char arr2[20] = { 0 };
my_strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
strcat
介绍
实现
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++);
return ret;
}
int main()
{
char arr1[20] = { "hello " };
char arr2[] = "world";
my_strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
strcmp
介绍
实现
#include <assert.h>
#include <stdio.h>
int my_strcmp(const char * arr1, const char* arr2)
{
assert(arr1 && arr2);
while (*arr1 == *arr2)
{
if (*arr1 == '\0')
{
return 0;
}
else
{
arr1++;
arr2++;
}
}
return *arr1 - *arr2;
}
int main()
{
char arr1[] = "abcde";
char arr2[] = "abcq";
int a = my_strcmp(arr1, arr2);
printf("%d", a);
return 0;
}
strncpy
介绍
实现
#include <stdio.h>
#include <assert.h>
char* my_strncpy(char* str1, const char* str2, int n)
{
assert(str1 && str2);
char* ret = str1;
for (int i = 0; i < n; i++)
{
if (*str2)
{
*str1++ = *str2++;
}
else
{
*str1++ = *str2;
}
}
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "xxxxxxxxxxxx";
my_strncpy(arr2, arr1, 7);
printf("%s", arr2);
return 0;
}
strncat
介绍
实现
#include <stdio.h>
#include <assert.h>
char* my_strncat(char* str1, const char* str2, int n)
{
assert(str1 && str2);
char* ret = str1;
while (*str1)
{
str1++;
}
for (int i = 0; i < n; i++)
{
if (*str2)
{
*str1++ = *str2++;
}
else
{
break;
}
}
*str1 = '\0';
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[20] = "xx\0xxxxxxxxx";
my_strncat(arr2, arr1, 15);
printf("%s", arr2);
return 0;
}
strncmp
介绍
实现
#include <stdio.h>
#include <assert.h>
int my_strncmp(const char* arr1, const char* arr2, int n)
{
assert(*arr1 && *arr2);
for (int i = 0; i < n; i++)
{
if (*arr1 != *arr2)
{
return *arr1 - *arr2;
}
else
{
if (*arr1 == '\0')
{
return 0;
}
}
arr1++;
arr2++;
}
return 0;
}
int main()
{
char arr1[] = "abc";
char arr2[] = "abc";
int a = my_strncmp(arr1, arr2, 5);
printf("%d", a);
return 0;
}
strtok
介绍
实现
#include <stdio.h>
#include <string.h>
int is(const char* arr1, const char* arr2)
{
while (*arr2)
{
if (*arr1 == *arr2)
{
return 1;
}
arr2++;
}
return 0;
}
char* my_strtok(const char* arr1, const char* arr2)
{
static char* rember = NULL;
char* qidian = NULL;
if (arr1 != NULL)
{
qidian = (char*)arr1;
}
else
{
qidian = rember;
}
if (*qidian == '\0')
{
return NULL;
}
char* ret = qidian;
while (*qidian != '\0')
{
if (is(qidian, arr2))
{
*qidian = '\0';
qidian++;
break;
}
qidian++;
}
rember = qidian;
return ret;
}
int main()
{
char arr[] = "zheng.yuhang@qq.com";
char bj[] = "@.";
char cpy_arr[30] = { 0 };
strcpy(cpy_arr, arr);
char* p = NULL;
for (p = my_strtok(cpy_arr, bj); p != NULL; p = my_strtok(NULL, bj))
{
printf("%s\n", p);
}
return 0;
}
strstr
介绍
实现
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* arr1, const char* arr2)
{
assert(arr1 && arr2);
if(*arr2 == '\0')
{
return (char *)arr1;
}
while (*arr1)
{
const char* cpyarr1 = arr1;
const char* cpyarr2 = arr2;
int flag = 1;
while (*cpyarr2)
{
if (*cpyarr1 != *cpyarr2)
{
flag = 0;
break;
}
cpyarr1++;
cpyarr2++;
}
if (flag)
{
return (char*)arr1;
}
arr1++;
}
return NULL;
}
int main()
{
char arr1[] = "abbbbcdef";
char arr2[] = "bbc";
char* ret = my_strstr(arr1, arr2);
printf("%s", ret);
return 0;
}
内存函数(memcpy, memmove, memset, memcmp)
//my_memory.h
#pragma once
#include <stdio.h>
#include <assert.h>
//内存拷贝函数——my_memcpy
//实现不重叠的两块内存空间的拷贝
void* my_memcpy(void* arr1, const void* arr2, int num);
//内存拷贝函数——my_memmove
//实现重叠的两块内存空间的拷贝
void* my_memmove(void* arr1, const void* arr2, int num);
//内存设置函数——my_memset
//按字节逐一设置成相应的大小
void* my_memset(void* arr, int a, int num);
//内存比较函数——my_memset
//按字节逐一比较大小
int my_memcmp(const void* arr1, const void* arr2, int num);
//my_memory.c
#include "my_memory.h"
void* my_memcpy(void* arr1, const void* arr2, int num)
{
assert(arr1 && arr2);
int i = 0;
for (i = 0; i < num; i++)
{
*(((char*)arr1) + i) = *(((char*)arr2) + i);
}
return (void*)arr1;
}
void* my_memmove(void* arr1, const void* arr2, int num)
{
assert(arr1 && arr2);
if (arr1 > arr2)
{
while (num--)
{
*(((char*)arr1) + num) = *(((char*)arr2) + num);
}
}
else
{
int i = 0;
for (i = 0; i < num; i++)
{
*(((char*)arr1) + i) = *(((char*)arr2) + i);
}
}
return arr1;
}
void* my_memset(void* arr, int a, int num)
{
for (int i = 0; i < num; i++)
{
*(((char*)arr) + i) = a;
}
return arr;
}
int my_memcmp(const void* arr1, const void* arr2, int num)
{
for (int i = 0; i < num; i++)
{
if (*((char*)arr1) != *((char*)arr2))
{
return *((char*)arr1) - *((char*)arr2);
}
arr1 = (char*)arr1 + 1;
arr2 = (char*)arr2 + 1;
}
return 0;
}
结语
以上便是今天的全部内容。如果有帮助到你,请给我一个免费的赞。
因为这对我很重要。
编程世界的小比特,希望与大家一起无限进步。
感谢阅读!