【C语言】字符函数和字符串函数的介绍和模拟实现

介绍处理字符和字符串的库函数的使用和注意事项

求字符串长度 strlen

长度不受限制的字符串函数 strcpy strcat strcmp

长度受限制的字符串函数介绍 strncpy strncat strncmp

0. 前言

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串中或者字符数组 中。

字符串常量 适用于那些对它不做修改的字符串函数。

1. 函数介绍

1.1 strlen

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

参数指向的字符串必须要以 '\0' 结束。

注意函数的返回值为size_t,是无符号的( 易错 )

1.2 strcpy 

Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point)。

源字符串必须以 '\0' 结束。

会将源字符串中的 '\0' 拷贝到目标空间。

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

目标空间必须可变。

1.3 strcat

Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.

源字符串必须以 '\0' 结束。

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

目标空间必须可修改。 

1.4 strcmp

This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached. 

标准规定:

第一个字符串大于第二个字符串,则返回大于0的数字。

第一个字符串等于第二个字符串,则返回0。

第一个字符串小于第二个字符串,则返回小于0的数字。

1.5 strncpy

Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.

拷贝num个字符从源字符串到目标空间。

如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。 

1.6 strncat

 Appends the first num characters of source to destination, plus a terminating null-character. If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.

将源的前num个字符追加到目标,再加上一个终止的null字符。


如果源中的C字符串的长度小于num,则只有终止之前的内容空字符被复制。

1.7 strncmp

比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

 

2.模拟实现 

2.1 strlen

size_t my_strlen(const char* str)
{assert(str);const char* end = str;while (*++end){;}return end - str;
}

2.2 strcpy 

char* my_strcpy(char* dest, const char* src)
{assert(dest && src);char* cp = dest;while (*cp++ = *src++){;}return dest;
}

2.3 strcat 

char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* cp = dest;while (*cp){cp++;}while (*cp++ = *src++){;}return dest;
}

2.4 strcmp 

int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0'){return 0;}str1++;str2++;}return *str1 - *str2;
}

2.5 strncpy

char* my_strncpy(char* dest, const char* src,size_t count)
{assert(dest && src);char* start = dest;while (count && (*dest++ = *src++) != '\0'){count--;}if (count){*dest = '\0';}return start;
}

2.6 strncat

char* my_strncat(char* front, const char* back, size_t count)
{assert(front && back);char* start = front;while (*front++){;}front--;while (count--){if ((*front++ = *back++) == '\0'){return start;}}*front = '\0';return start;
}

2.7 strncmp


int my_strncmp(const char* str1, const char* str2, size_t count)
{assert(str1, str2);while (count-- && (*str1 == *str2)){if (count == 0 || *str1 == '\0'){return 0;}str1++;str2++;}return *str1 - *str2;
}

 

 

 

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

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

相关文章

从0开始的STM32HAL库学习2

外部中断(HAL库GPIO讲解) 今天我们会详细地学习STM32CubeMX配置外部中断,并且讲解HAL库的GPIO的各种函数。 准备工作: 1、STM32开发板(我的是STM32F103C8T6) 2、STM32CubeMx软件、 IDE: Keil软件 3、STM32F1xx/ST…

Jenkins设置开机自启(以war包方式启动jenkins)

配置环境:Centos7.6/Jenkins 2.452.2/jdk-21.0.3 jenkins启动命令: nohup java -jar jenkins.war > /dev/null 2>&1 & 1、创建sh脚本文件 # jenkins.war包,放在了/root/software目录 cd /root/software vim jenkins-start.sh …

Qt QWebSocket网络编程

学习目标:Qt QWebSocket网络编程 学习前置环境 QT TCP多线程网络通信-CSDN博客 学习内容 WebSocket是一种通过单个TCP连接提供全双工通信信道的网络技术。2011年,IETF将WebSocket协议标准化为 RFC6455,QWebSocket可用于客户端应用程序和服…

怎么把便签主面板置顶 便签主面板置顶方法

作为一名经常需要处理大量信息和任务的作家,我发现便签记事真的是我的救星。无论是临时灵感、会议要点还是待办事项,便签都能帮我快速记录,让我不再遗漏任何重要信息。而且,便签的应用场景也非常广泛,无论是在电脑前写…

在JavaScript中,什么是解构赋值(destructuring assignment)?

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介在JavaScript中,什么是解构赋值(destructuring assignment)?1. 引言2. 解构赋值的概念3. 数组解构赋值3.1 基本语法3.2 跳过元素3.3 默认值3.4 交换变量值 4. 对象解构赋值4.1 基本语…

goaccess分析json格式日志

一.安装使用yum安装,yum install goaccess 二.主要介绍格式问题 1.nginx日志格式如下: log_format main escapejson {"time_local":"$time_local", "remote_addr":"$remote_addr", "r…

回收站清空了怎么恢复回来?8个数据恢复方法汇总分享!

在日常工作中,我们常常会遇到一个令人头痛的问题:回收站清空了怎么恢复回来?这种情况其实比想象中更常见。有时在整理桌面时可能会不小心彻底清理文件,或者误开启了回收站的自动清理功能,甚至可能因为病毒或bug而意外丢…

人工智能内容创作中RAG方法综述

论文链接:https://arxiv.org/pdf/2402.19473v1 尽管AIGC取得了显著的性能,但仍面临着如保持最新和长尾知识困难、数据泄露风险以及训练和推理成本高昂等挑战。检索增强生成(RAG)作为一种范式应运而生,通过从可用数据存…

【ACM珠海分会,IEEE Fellow加盟,CPS出版】第四届管理科学和软件工程国际学术会议(ICMSSE 2024,7月19-21)

第四届管理科学和软件工程国际学术会议(ICMSSE 2024)由ACM珠海分会,广州番禺职业技术学院主办;全国区块链行业产教融合共同体,AEIC学术交流中心承办,将于2024年7月19-21日于广州召开。 会议旨在为从事管理与软件工程领域的专家学…

realsense D435l+mid360标定

目录 一、安装realsense环境 二、获取realsense D450L相机内参 三、标定雷达和相机 1.下载livox_camera_calib 2.修改配置参数 3.使用fastlio生成点云 4.标定 一、安装realsense环境 git clone https://github.com/IntelRealSense/librealsense.git cd librealsense //更…

【文科类cpci/cnki会议,主题广泛】第九届现代管理、教育与社会科学国际学术会议(MMET2024)

会议信息 点击跳转会议官网(更多会议信息可添加会议官网下方负责老师-杨老师) 大会时间:2024年09月20-22日 大会地点:中国-厦门 提交检索:CPCI,CNKI (知网检索快速稳定) 点击一键投稿 点击一键参会&a…

模拟开关应用注意事项

应用模拟开关时,开关时间是一个重要的考虑因素,但是,不能将开关时间与建立时间相 混淆。导通时间和关断时间只是从控制输入到开关切换间的传播延迟的一种衡量指标,主要由驱动和电平转换电路中的时间延迟导致。tON和tOFF两个值一般…

基于单片机的温湿度感应智能晾衣杆系统设计

[摘 要] 本设计拟开发一种湿度感应智能晾衣杆系统 , 此新型晾衣杆是以单片机为主控芯片 来控制的实时检测系统 . 该系统使用 DHT11 温湿度传感器来检测大气的温湿度 , 然后通过单 片机处理信息来控制 28BYJ &…

网络安全防御 -- 防火墙安全策略用户认证综合实验

实验拓扑: 实验目的: 1、DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问。 2、生产区不允许访问互联网,办公区和游客区允许访问互联网。 3、办公区设备10.0.2.10不允许访问DM…

sql常用语句:

1.联合查询 对表中的数据进行限制; 2.从一个表复制到另一个表 SELECT INTO 将数据复制到一个新表(有的 DBMS 可以覆盖已经存在的表,这依赖于 所使用的具体 DBMS) SELECT *(字段) INTO CustCopy FROM Cu…

高仿imtoken钱包源码/获取助记词/获取私钥/自动归集

简介: 高仿imtoken钱包/获取助记词/获取私钥/自动归集 带双端,无纯源码 下载源码

从微分方程组构建 bbr 模型

描述分析 bbr 的文字自 2016 年底起至今从空白到泛滥,我自己在期间贡献了不少,本文又是一篇,但不同的是,本文尝试用闭环的数学模型给出一个 bbr 的全貌,顺便和 aimd 做对比。 先看带宽特性 bw(t),设瓶颈带…

等保2.0丨5分钟速览:小白都能理解的等保2.0简介

等保2.0的概念 等保2.0全称网络安全等级保护2.0制度,是我国网络安全领域的基本国策、基本制度。以1.0的规范为基础,等级保护标准以积极的防御为重点,由被动的防御发展为安全可信、动态感知和全过程的事前、事中和事后的全过程的全方位的审核…

函数式接口、匿名内部类、lambda表达式

一、函数式接口 只有一个抽象方法的接口叫函数式接口,不能有两个,也不能有方法实现。 FunctionalInterface注解标记,在idea中可以用这个注解验证是不是函数式接口。实现函数式接口可以转成lambda表达式。 二、匿名内部类 匿名内部类的格式&a…

7.11 cf div3 C

Problem - C - Codeforces 操作 根据给定的索引数组ind和字符串c,按照一定的顺序修改字符串s中对应位置的字符。具体来说,第i次操作会修改s中索引为indi的位置的字符,将其设置为ci。 将c字符串按照从小到大排序,替换ind数组所表…