IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 一些字符操作函数和内存操作函数的实现(c语言) -> 正文阅读

[C++知识库]一些字符操作函数和内存操作函数的实现(c语言)

1.模拟实现strlen

其声明:size_t strlen(const char*str)

(1)字符串以'\0’作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')

(2)参数指向的字符串必须以'\0'结束

(3)函数返回值是size_t是无符号整数

实现的代码如下:

#include<stdio.h>
int my_strlen(const char* str)
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
			
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int len=my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

2.模拟实现strcpy

其声明char*strcpy(char*dest,const char*soure)

(1)源字符串必须以'\0’结束

(2)会将源字符串中的'\0',拷贝到目标空间

(3)目标空间必须足够大,以确保能存放源字符串

(4)目标空间必须可变

实现代码如下:

#include<stdio.h>
void my_strcpy(char* s1,const char* s2)
{
	while (*s1++ = *s2++)
	{

	}
}
int main()
{
	char s1[20] = { 0 };
	char s2[] = "abcdef";
	my_strcpy(s1, s2);
	printf("%s", s1);
	return 0;
}

3.模拟实现strcmp

其声明int strcmp(const char*str1,const char*str2)

标椎规定:(1)str1大于str2返回大于0的数

? ? ? ? ? ? ? ? ? ?(2)str1==str2返回0

? ? ? ? ? ? ? ? ? ?(3)str1小于str2返回小于0的数

代码如下:

int my_strcmp(const char* src, const char* dst)
{
	int ret = 0;
	assert(src && dst);
	while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)
	{
		src++;
		dst++;
	}
	if (ret > 0)
		return 1;
	else if (ret < 0)
		return -1;
	return ret;
}
int main()
{
	char s1[] = "abcdef";
	char s2[] = "cdefab";
	int ret=my_strcmp(s1, s2);
	if (ret > 0)
		printf("s1>s2");
	else if (ret == 0)
		printf("s1=s2");
	else
		printf("s1<s2");
	return 0;
}

4.模拟实现strcat

其声明char*strcat(char*dest,const char*soure)

(1)源字符串必须以'\0'结束

(2)目标空间必须足够大,能容纳下源字符串的内容

(3)目标空间必须修改

(4)不能自己给自己追加

代码如下:

#include<stdio.h>
#include<assert.h>
char* my_strcat( char* s1,const char* s2)
{
	char* ret = s1;
	assert(s1 && s2);
	while (*s1)
	{
		s1++;
	}
	while (*s1++ = *s2++)
	{
		;
	}
	return ret;
}
int main()
{
	char s1[20] = "abcdef";
	char s2[] = "ghijk";
	my_strcat(s1, s2);
	printf("%s\n", s1);
	return 0;
}


5.模拟实现strstr

其声明char*strstr(const char*s1,const char*s2)

代码如下:

//#include<stdio.h>
//#include<assert.h>
char* my_strstr(const char* str1,const char*str2 )
{
	assert(str1 && str2);
	char* s1 = str1;
	char* s2 = str2;
	char* cur = str1;
	if (!*str2)
		return str1;
	while (*s1&&*s2)
	{
		s1 = cur;
		s2 = str2;
		while (*s1==*s2&&*s1 && *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0');
		return cur;
		cur++;
		
	}
	return NULL;
}
int main()
{
	char s1[] = "abcdef";
	char s2[] = "abcd";
	char* ret = my_strstr(s1, s2);
	if (ret !=NULL)
		printf("yes\n");
	else
		printf("no\n");

	return 0;
}

6.模拟实现memcpy

其声明void*memcpy(void*dest,const void*source,size_t num)

(1)函数memcpy从source的位置开始向后复制num个字节的数到dest的内存位置

(2)这个函数在遇到'\0'的时候并不会停下来

(3)如果source和dest有任何重叠的地方,复制结果都是为定义

在一些编译器中memcpy处理不了内存重叠的情况

代码如下:

#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[] = { 5,4,3,2,1 };
	my_memcpy(arr1,arr2,5*sizeof(int));
		for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

7.模拟实现memmove

其声明void*memmove(void*dest,const void*source,size_t num)

如果源空间和目标空间重叠就用memmove处理

代码如下:

#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, void* src, size_t count)
{
	void* ret = dest;
	assert(dest && src);
		if (dest < src)
		{
			while (count--)
			{
				*(char*)dest = *(char*)src;
				++(char*)dest;
				++(char*)src;
			}
		}
		else
		{
			while (count--)
			{
				*((char*)dest + count) = *((char*)src + count);
			}

		}
		return ret;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 5*sizeof(int));
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,评论留下各自的见解,相互讨论。希望大家多多给予支持,赠人玫瑰,手有余香!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-01 20:25:11  更:2022-02-01 20:26:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:27:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码