天天看点

C语言之模拟实现字符串+内存函数

strlen

strcpy

strcmp

strcat

strstr

memcpy

memmove

三种方式实现strlen

函数使用方法
    char* str = "I am the best!";
	printf("%d\n", strlen(str));
           
模拟实现
①指针-指针
#pragma warning (disable:4996)
#include<stdio.h>
int MyStrlen(char* p)
{
	char* s = p;
	while (*s != '\0')
	{
		s++;
	}
	return s-p;
}
int main()
{
	char* a = "Lilan is my girl!";
	printf("%d\n", MyStrlen(a));
	return 0;
}

②递归
#include<stdio.h>
int MyStrlen(char* str)
{
	if (*str == '\0')
		return 0;
	return 1 + MyStrlen(str + 1);
}
int main()
{
	char* str1 = "lilan is cute!";
	printf("%d\n", MyStrlen(str1));
	return 0;
}

③计数器
#include<stdio.h>
int MyStrlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char *str = "Lilan is cute!";
	printf("%d\n", MyStrlen(str));
	return 0;
}
           

strcpy

函数使用方法
char *strcpy( char *dest, const char *src );
           
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
void MyStrcpy(char *str1, char *str2)
{
	for (int i = 0;; i++)
	{
		*(str2 + i) = *(str1 + i);
		if (*(str1+i) == '\0')
			break;
	}
}
int main()
{
	char str1[999];
	char str2[999];
	scanf("%s", str1);
	MyStrcpy(str1,str2);
	printf("复制后str2的内容为:%s\n", str2);
	return 0;
}
           

strcmp

函数使用方法
int strcmp( const char *string1, const char *string2 );
//返回值为int类型
//< 0     string1 smaller than string2 
//= 0     string1 等于 string2 
//> 0     string1 bigger than string2 

           
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
#include<assert.h>
int MyStrcmp(char *str1, char *str2)
{
	assert(str1&&str2);
	if (str1 == NULL)
		return -1;
	if (str2 == NULL)
		return 1;
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
	{
		return -1;
	}
}
int main()
{
	char* str1 = "azcd";
	char* str2 = "afcd";
	printf("%d\n", MyStrcmp(str1, str2));
	return 0;
}
           

strcat(字符串拼接)

函数使用方法
char *strcat( char *dest, const char *src );
           
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
char* MyStrcat(char *dest,char *src)
{
	char *p = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = '\0';
	return p;
}
int main()
{
	//注意这里不能是指针,字符串放在只读区,不能修改
	//数组形式是对内存的一份拷贝
	char dest[20] = "bit";
	char *src = "hello";
	MyStrcat(dest, src);
	printf("%s\n", dest);
	return 0;
}
           

strtok(字符串分隔函数)

函数使用方法
char *strtok( char *str, const char *strDelimit );
//str目标字符串
//strDelimit 一个或多个分隔符
           
#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "2000.08.01/lkl";
	char* p = strtok(str, "./");
	while (p != NULL)
	{
		printf("%s\n", p);
		p = strtok(NULL, "./");
	}
	return 0;
}
           
C语言之模拟实现字符串+内存函数

strstr(在主串中寻找子串)

函数使用方法
char *strstr( const char *string1, const char *string2 );
//在string1中寻找string2;
           
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
char* MyStrstr(char* str1, char* str2)
{
	char* start = str1;
	while (*start != '\0')
	{
		char* s1 = start;//每次都从start开始
		char* s2 = str2; //每次从头开始
		while (s1 && s2 && *s1 == *s2)
			//主串子串相同,就往后加,但不能是\0
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return start;
		}
		start++;//不一样之后主串往后加一
	}
	return NULL;
}
int main()
{
	char *str1 = "likunlong";
	char* str2 = "kun";
	printf("%s\n", MyStrstr(str1, str2));
	return 0;
}
           

memcpy(内存拷贝函数)

函数使用方法
void *memcpy( void *dest, const void *src, int count );
//count为所拷贝字节数
           
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
#include<memory.h>
void* MyMemcpy(void* dest, void* src, int count)
{
	void* ret = dest;
	while (count != 0)
	{
		*(char*)dest = *(char*)src;
		((char*)dest)++;//++优先级高,给前面带括号
		((char*)src)++;
		count--;
	}
	return ret;
}
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	//MyMemcpy(arr, arr + 2, 16);
	MyMemcpy(arr+2,arr,16);
	int i = 0;
	for (; i < 8; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
           

memmove

函数使用方法
void *memmove( void *dest, const void *src, int count );
//count为所移动字节数
           
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
void* MyMemmove(void* dest, void* src, int count)
{
	void* ret = dest;
	if (src > dest)
	{
		while (count != 0)
		{
			*(char*)dest = *(char*)src;
			((char*)dest)++;//++优先级高,给前面带括号
			((char*)src)++;
			count--;
		}
	}
	//src<dest的情况,发生内存重叠,从后往前拷贝
	else
	{
		count--;//15次
		while (count >= 0)
		{
			*((char*)dest + count) = *((char*)src + count);
			count--;
		}
	}
	return ret;
}
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
	MyMemmove(arr + 2, arr, 16);
	int i = 0;
	for (; i < 8; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

           

继续阅读