C语言:字符串函数、内存函数剖析

一、字符串函数

(一)求字符串长度

1、strlen

(1)库函数实现

strlen用来计算字符串的长度,遇到’\0’读取结束,这里‘\0’不算作长度。

size_t strlen ( const char * str );    

在这里插入图片描述

(2)自定义实现

自定义实现我们采取三种方式

//计数器实现
size_t my_strlen1(const char* str) {
	assert(str);
	int i = 0, count = 0;
	while (str[i]) {
		count += 1;
		i += 1;
	}
	return count;
}

//指针的实现
size_t my_strlen2(const char* str) {
	assert(str);
	const char* p = str;
	while (*p != '\0') p = p + 1;
	return p - str;
}

//递归的实现
size_t my_strlen3(const char* str) {
	assert(str);
	if (*str == '\0') return 0;
	else return my_strlen3(str + 1) + 1;
}

(二)长度不受限制的字符串函数

1、strcpy

(1)库函数实现
char * strcpy ( char * destination, const char * source );

strcpy用来将一个字符串复制到另一个字符串里面,包含’\0’。
目的空间要足够复制,不然程序会崩溃。

char * strcpy ( char * destination, const char * source );

在这里插入图片描述

(2)自定义实现

这里while循环十分巧妙,既把’\0’复制进入destination,又结束循环
目的空间要足够复制,不然程序会崩溃。

char* my_strcpy(char* destination, const char* source) {
	assert(destination && source);
	char* ret;
	ret = destination;
	while (*destination++ = *source++) {
		;
	}
	return ret;
}

2、strcat

在目标字符串后面继续追加字符串
目的空间要足够复制,不然程序会崩溃。

(1)库函数实现
char * strcat ( char * destination, const char * source );

在这里插入图片描述

(2)自定义实现

目的空间要足够复制,不然程序会崩溃。

char* my_strcat(char* destination, const char* source) {
	assert(destination && source);
	char* ret = destination;
	while (*destination != '\0') destination += 1;
	while (*destination++ = *source++);
	return ret;
}

3、strcmp

strcmp用来比较两个字符串大小,C语言规定小于返回负数,大于返回负数,相等返回0。

(1)库函数实现
int strcmp ( const char * str1, const char * str2 );

在这里插入图片描述

(2)自定义实现
int my_strcmp(const char* arr1, const char* arr2) {
	assert(arr1 && arr2);
	while (*arr1 == *arr2) {
		if (*arr1 == '\0') return 0;
		arr1++;
		arr2++;
	}
	if (*arr1 > *arr2) return 1;
	else return -1;
}

(三)长度受限制的字符串函数介绍

1、strncpy

相比于strcpy,添加了比较数量, 从souce复制几个到destination。

char * strncpy ( char * destination, const char * source, size_t num );

2、strncat

相比于strcat,添加了追加数量,从souce追加几个到destination。

char * strncat ( char * destination, const char * source, size_t num );

3、strncmp

相比于strcmp,添加了比较数量。

int strncmp ( const char * str1, const char * str2, size_t num );

(四)字符串查找

1、strstr

const char * strstr ( const char * str1, const char * str2 );

在这里插入图片描述
在这里插入图片描述

2、strtok

char * strtok ( char * str, const char * delimiters );

用来将一个字符串里面的信息分开。
第一个字符串不可以传const修饰的字符串常量
在这里插入图片描述

(五)错误信息报告

1、strerror

代码生产时会有一个全局变量errno(错误码)
strerror将错误码所对应的错误字符串的首字符返回。

char * strerror ( int errnum );

在这里插入图片描述
在这里插入图片描述

2、prerror

prerror函数是strerror的升级版,相当于printf + strerror

void perror ( const char * str );

在这里插入图片描述

二、内存操作函数

(一)内存拷贝

1、memcpy

void * memcpy ( void * destination, const void * source, size_t num );

按照字节拷贝

(1)库函数实现

在这里插入图片描述
在这里插入图片描述

(2)自定义实现
void* my_memcpy(void* dest, const void* src, size_t num) {
	void* ret = dest;
	assert(dest && src);
	while (num--) {
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

2、memmove

相比于memcpy,可以针对重复内存的拷贝
按照字节拷贝

void * memmove ( void * destination, const void * source, size_t num );
(1)库函数实现

和memcpy相似

(2)自定义实现
void* my_memmove(void* dest,const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	if (dest < src)//前->后
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else//后->前
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}

	return ret;
}

(二)内存比较

1、memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

依次按字节来比较两个内存块大小

(三)内存设置

1、memset

void * memset ( void * ptr, int value, size_t num );
(1)库函数实现

在这里插入图片描述
切记不可用来初始化设置整形数组中元素。如下,处理4个字节,就是一个整形空间
在这里插入图片描述
在这里插入图片描述

三、结束语

相信通过这篇文章,小伙伴们对字符串函数和内存函数的理解更加深刻了吧,记得给小编一个小小的赞哦!
在这里插入图片描述

  • 53
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值