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

news2024/9/17 7:18:18

字符串函数、内存函数剖析

  • 一、字符串函数
    • (一)求字符串长度
      • 1、strlen
        • (1)库函数实现
        • (2)自定义实现
    • (二)长度不受限制的字符串函数
      • 1、strcpy
        • (1)库函数实现
        • (2)自定义实现
      • 2、strcat
        • (1)库函数实现
        • (2)自定义实现
      • 3、strcmp
        • (1)库函数实现
        • (2)自定义实现
    • (三)长度受限制的字符串函数介绍
      • 1、strncpy
      • 2、strncat
      • 3、strncmp
    • (四)字符串查找
      • 1、strstr
      • 2、strtok
    • (五)错误信息报告
      • 1、strerror
        • 2、prerror
  • 二、内存操作函数
    • (一)内存拷贝
      • 1、memcpy
        • (1)库函数实现
        • (2)自定义实现
      • 2、memmove
        • (1)库函数实现
        • (2)自定义实现
    • (二)内存比较
      • 1、memcmp
    • (三)内存设置
      • 1、memset
        • (1)库函数实现
  • 三、结束语

一、字符串函数

(一)求字符串长度

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个字节,就是一个整形空间
在这里插入图片描述
在这里插入图片描述

三、结束语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宠物猫用空气净化器真的有用吗?值得买的猫用空气净化器牌子排名

作为一名6年资深铲屎官&#xff0c;每天铲猫砂盆的工作无疑是一项挑战。家中不仅弥漫着难以忍受的气味&#xff0c;而且家里的小孩和老人偶尔会因为过敏性鼻炎或结膜炎等问题感到不适。换毛季节尤其头疼&#xff0c;浮毛无处不在&#xff1a;沙发、外套、坐垫&#xff0c;甚至连…

学习008-02-04-08 Localize UI Elements(本地化UI元素)

Localize UI Elements&#xff08;本地化UI元素&#xff09; This lesson explains how to localize an XAF application. It describes how to translate UI elements into German and create a multi-language application. 本课介绍如何本地化XAF应用程序。它描述了如何将U…

【C语言】在限制定条件下数据移动

C语言 在限制定条件下数据移动 给定一个数组 nums&#xff0c;编写一个函数将所有0移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意&#xff0c;必须在不复制数组的情况下原地对数组进行操作。 作业题 解决思路及代码 要将数组中的所有 0 移动到数组的末…

数学中的连分式、无穷连根式、平方根

连分式 连分式&#xff08;continued fraction&#xff09;由和与倒数的多层嵌套构成&#xff0c;可以是有限的&#xff0c;也可以是无限的。 表达式&#xff1a;或 import mathdef fraction_to_continued_fraction(numerator, denominator, max_terms):"""计算…

WordPress原创插件:搜索引擎抓取首图seo图片

WordPress原创插件&#xff1a;搜索引擎抓取首图seo图片 插件设置 插件将在网站头部添加适当的meta标签&#xff0c;以便百度等搜索引擎抓取指定的固定图像。 插件下载 https://download.csdn.net/download/huayula/89596527

[Meachines] [Easy] Friendzone LFI+Python-OS库污染权限提升

信息收集 IP AddressOpening Ports10.10.10.123TCP:21,22,53,80,139,443,445 $ nmap -p- 10.10.10.123 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.3 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Lin…

vue项目上线打包后出现的问题

1、出现空白页 1.1 打包路径&#xff1a; module.exports {publicPath:./, //修改为绝对路径 } 修改完打包路径后build可以展示页面 1.2 路由模式&#xff1a; 项目上线要求是history模式&#xff0c;需要后端做重定向 前端自测可以使用hash模式 2、代理和环境变量 问题…

信创系统上的数据加密和防泄露该如何对应?

随着信息技术的快速发展和数字化转型的深入推进&#xff0c;关于信创加密和信创防泄露的信息安全问题日益凸显。特别是在国家战略层面&#xff0c;推动自主可控的信息技术体系建设成为重中之重。深信达信创沙盒作为一款基于国产操作系统&#xff08;如麒麟、统信等&#xff09;…

Hugo 部署与自动更新(Git)

文章目录 Nginx部署Hugonginx.confhugo.conf Hugo自动更新Hugo自动更新流程添加访问令牌添加web hookrust实现自动更新接口 Nginx部署Hugo nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;even…

大模型系统学习路线

随着技术的进步&#xff0c;大模型如OpenAI的GPT-4和Sora、Google的BERT和Gemini等已经展现出了惊人的能力-从理解和生成自然语言到创造逼真的图像及视频。所以掌握大模型的知识和技能变得越来越重要。 下面是学习大模型的一些建议&#xff0c;供大家参考。 必备基础知识 **…

爬虫实战-掌上高考网实战

1.确定需求&#xff1a;爬取什么数据爬取大学名称 2.找到数据源地址数据在哪个链接中https://api.zjzw.cn/web/api/?keyword&page1&province_id&ranktype&request_type1&size20&top_school_id[3703,2461,659,3117,597,1724]&type&uriapidata/…

【NPU 系列专栏 2.6 -- - NVIDIA Xavier SoC】

文章目录 NVIDIA Xavier SoCXavier 主要组件Xavier SoC 的型号Xavier SoC 的算力Xavier AGXXavier NXXavier 应用场景自动驾驶机器人物联网(IoT)医疗设备NPU 对比SummaryNVIDIA Xavier SoC 英伟达 Xavier SoC 是英伟达推出的一款高性能系统级芯片,专门为人工智能(AI)和自…

c# - - - ASP.NET Core 网页样式丢失,样式不对

c# - - - ASP.NET Core 网页样式丢失&#xff0c;样式不对 问题 正常样式是这样的。 修改项目名后&#xff0c;样式就变成这样了。底部的内容跑到中间了。 解决 重新生成解决方案&#xff0c;然后发布网站。 原因&#xff1a; 修改项目名之前的 div 上有个这个自定义属…

Mysql开启远程控制简化版,亲测有效

首先关闭防火墙 改表法 打开上图的CMD&#xff0c;输入密码进入&#xff0c;然后输入一下指令 1.use mysql; 2.update user set host % where user root;//更新root用户的权限&#xff0c;允许任何主机连接 3.FLUSH PRIVILEGES;//刷新权限&#xff0c;使更改生效 具体参考…

详解 @RequestHeader 注解在 Spring Boot 中的使用

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

JS+H5在线文心AI聊天(第三方接口)

源码在最后面 调用的不是文心官方接口 可以正常聊天 有打字动画 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

文献笔记|综述|A Survey of Large Language Models (前3章)

A Survey of Large Language Models 题目&#xff1a;大语言模型综述 作者&#xff1a;Wayne Xin Zhao, Kun Zhou, Junyi Li et al. 来源&#xff1a;arXiv 单位&#xff1a;中国人民大学高瓴人工智能学院、中国人民大学信息学院 关键词&#xff1a;Large Language Models; Eme…

如何快速获取全网精准客流?揭秘不为人知的5大运营策略!

有同行所在的地方&#xff0c;就一定拥有咱们需要的客户。客户看的是结果&#xff0c;搜索的是问题&#xff0c;寻找的是答案。 如果没有付费流量&#xff0c;单纯靠搞免费流量&#xff0c;很多大厂的运营也会变得一文不值。一个牛逼的运营&#xff0c;不仅是会做付费流量&…

【Vue2】3-使用Vue脚手架

目录 初始化脚手架 说明 具体步骤 模板项目的结构 关于不同版本的Vue vue.config.js配置文件 ref属性 配置项props mixin&#xff08;混入&#xff09; 插件 scoped样式 总结TodoList案例 webStorage&#xff08;浏览器本地存储&#xff09; TodoList本地存储 组…

pp 5 报废 分派 替代

报废&#xff1a; 装配报废是关于成品的&#xff0c;会在生产订单自动增加数量&#xff0c;对组件有影响 但是在组件上面设置报废是不是影响成品物料的 注意&#xff1a;成品报废和组件报废数量会进行叠加的 但是物料主数据和bom同时设置报废率&#xff0c;不会叠加&#xff0…