C语言之模拟实现字符串+内存函数_不学没工作了的博客-程序员秘密

技术标签: strcat  c语言  memcpy  memmove  strstr  

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;
}

在这里插入图片描述

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;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45852612/article/details/110133571

智能推荐

VB.NET 01_zhvsby的博客-程序员秘密

Public Class Form1    Private Const _UserNameC As String = "Tanker.Z"  '常量声明 用 Const    Private Const _UserPasswordC As String = "Jereh"    Private Const _StringEmptyC As String = ""      Di

Beginning ASP.NET 2.0 in VB 2005: From Novice to Professional_topmvp的博客-程序员秘密

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。http://blog.csdn.net/topmvp - topmvpThe most up-to-date and comprehensive introductory ASP.NET book youll find on any shelf, Beginning ASP.NET 2

成功把ckpt模型文件转换为pb文件_泡泡里的月亮的博客-程序员秘密

这里放出成功后的打印结果,如想了解转换具体步骤,查看篇博客/home/gqw/anaconda3/envs/tensorflow/bin/python /home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/models-master/research/object_detection/export_inference_graph.py/home/gqw/anaconda3/envs/tensorflow/li

一些概念_LoadThinking的博客-程序员秘密

AcetoneISO:镜像文件挂载软件Adobe Photoshop Album,一个图像组织应用程序 [35]Arora:一款跨平台的开源网页浏览器Autodesk MotionBuilder, 三维角色动画软件Autodesk Maya, 3D建模和动画软件Avidemux, a Free Software program designed for

.net2.0_doubloon的博客-程序员秘密

从软件结构设计,讨论代码的简洁  示例项目Codematicdemo的Asp.net2.0版源码发布免费下载,代码生成器Codematic2.0bate版预览动软:http://www.maticsoft.com/softdown.aspxADO.NET的最佳实践技巧: http://www.maticsoft.com/News.aspx?id=4 

C语言数据结构冒泡排序算法_冒泡排序法小泡上浮数据结构_Yetteego的博客-程序员秘密

/**交换排序算法*冒泡排序*改进的冒泡排序算法 (优点可以降低时间复杂度)*/#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;void bubble_sort(int *s,int n);//简单的冒泡排序函数void up_bubblesort(int *s,int n);//改进的冒泡排序 可以降低时间复杂度void mai...

随便推点

pyqt5的【坑】_伟大的征服者的博客-程序员秘密

spyder 与pyqt5的冲突spyder也是用pyqt5写的,所以在pyqt5行运行Qt程序,支持的qt库要与spyder对应

python实现cnn特征提取_基于Python的卷积神经网络和特征提取_weixin_39623244的博客-程序员秘密

摘要:本文展示了如何基于nolearn使用一些卷积层和池化层来建立一个简单的ConvNet体系结构,以及如何使用ConvNet去训练一个特征提取器,然后在使用如SVM、Logistic回归等不同的模型之前使用它来进行特征提取。卷积神经网络(ConvNets)是受生物启发的MLPs(多层感知器),它们有着不同类别的层,并且每层的工作方式与普通的MLP层也有所差异。如果你对ConvNets感兴趣,这里...

Eclipse插件安装三种方式_xk_f的博客-程序员秘密

转载:Eclipse安装插件的三种方式

git将本地文件上传至远程github仓库_weixin_34226182的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

mysql 8.0 + Last_IO_Error: error connecting to master ‘[email protected]:3306‘ - retry ..._ycsdn10的博客-程序员秘密

一、问题 在进行两台linux机器进行MySQL8.0.13主从配置的时候,配置主从之后,在从库mysql进行显示信息show slave status; 出现了Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 60 retries: 1二、分析 在mysql的data目录下,用linux cat命令打开...

ndarray元素类型转换、shape变换、元素级运算、矩阵积_追梦小乐的博客-程序员秘密

python高级应用与数据分析学习笔记 081、ndarray元素数据类型int 类型 float 类型 uint类型 complex类型 string类型 object类型 unicode类型 boolen类型 2、ndarray元素类型转换:使用astype函数a = np.array([1,2,4],dtype=np

推荐文章

热门文章

相关标签