C语言函数:字符串函数及模拟实现strncpy()、strncat()、strncmp()
C语言函数:字符串函数及模拟实现strncpy()、strncat()、strncmp()
在了解strncpy、strncat()、前,需要先了解strcpy()、strncat():
C语言函数:字符串函数及模拟实现strlen() 、strcpy()、 strcat()_srhqwe的博客-CSDN博客
strncpy():
作用:拷贝受限制长度的字符串,意思是:可以指定拷贝字符的个数到目标字符串内。
限制字符串个数是为了让程序相对安全,降低访问越界等情况出现的可能性。但是不会绝对安全,一个程序员要写bug如挥手一般简单.
参数部分:
char * __cdecl strncpy (char * dest,const char * source,size_t count)
count是指定传入的个数。
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main()
{char de[20] = "abcdef";char so[] = "qwer";strncpy(de, so, 2);//拷贝2个字符printf("%s\n", de);//结果:qwcdefreturn 0;
}
当拷贝的字符串的个数超出原字符串的个数时,多出的部分会传\0进去:
![]()
strncpy函数的实现:
在strcpy基础上,写strncpy并不难。
因此直接展示源码:
char * __cdecl strncpy (char * dest,const char * source,size_t count)
{char *start = dest;while (count && (*dest++ = *source++) != '\0') /* copy string */count--;if (count) /* pad out with zeroes */while (--count)*dest++ = '\0';return(start);
}
因为多了count用于控制长度,所以while循环也多了一个count:
当count不为0时,while循环继续。
直到count为0时,自动跳出。
(*dest++ = *source++) != '\0') 和strcpy一样。其中!=\0可以去掉。
当没有\0时,dest和source一起++找下一个字符。
当在source找到\0时,把\0传入后while循环结束
if语句是为了保证count被置为0,因为count是我们需要拷贝的字符串个数。
就是上面所说的,如果超越了source本身的个数,会自动补\0
最后return 最初的dest,即start
strncat():
作用:追加受限制的字符串。
参数部分:
char * __cdecl strncat (char * front,const char * back,size_t count)
int main()
{char de[20] = "abcd";char so[] = "qwer";strncat(de, so, 2);printf("%s\n", de);//结果:abcdqwreturn 0;
}
与strncpy一样,如果追加的个数超出so的范围呢?会和strcpy一样?
int main()
{char de[20] = "abcd";char so[] = "qwer";strncat(de, so, 6);printf("%s\n", de);//结果:abcdqwerreturn 0;
}
并不会,具体是怎么做的呢?那就先看看这个函数的实现:
strncat的实现:
strncat的源码:
char * __cdecl strncat (char * front,const char * back,size_t count)
{char *start = front;while (*front++);front--;while (count--)if ((*front++ = *back++) == 0)return(start);*front = '\0';return(start);
}
第一个while循环,和strcat一样,先找到front的\0,然后从\0开始向后追加。
第二个while循环,count--作为条件语句,意思是循环count次,从而可以保证追加的个数。
while循环的if语句,是从front的\0开始向后追加back的元素,当在back中遇到是\0时,==0,那么就直接返回。因此如果追加的个数超出范围,不会追加\0,而是直接返回。
当count==0时,while循环退出,说明目前为止,已经把想传入的字符串传完了,因为上面是后置++,所以此时的front已经指向了最后一个元素的后面的指针。所以直接将此时指针指向的front的元素改成\0,即: *front = '\0';
最后return 原front地址
strncmp():
在了解strncmp()前,需要先了解strcmp():
C语言函数:字符串函数及模拟实现strcmp()_srhqwe的博客-CSDN博客
作用:对比受限制的两串字符串
strncmp和strcmp其实相差并不大,只是限制了对比的范围。返回值与strcmp是一样的
参数部分:
int __cdecl strncmp (const char *first,const char *last,size_t count )
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main()
{char de[20] = "abcd";char so[] = "aba";strncmp(de, so, 3);printf("%s\n", de);//结果:1return 0;
}
输入3比较的就是de和so的前三个字符
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main()
{char de[20] = "abad";char so[] = "aba";int ret = strncmp(de, so, 7);printf("%d\n",ret );//结果:1return 0;
}
即使输入的数字超出了两个字符串的个数也没事,因为往后比较的都是\0。与strcmp基本一致。
strncmp()函数的实现:
strncmp函数源码:
int __cdecl strncmp
(const char *first,const char *last,size_t count
)
{size_t x = 0;if (!count){return 0;}if( count >= 4 ){/* unroll by four */for (; x < count-4; x+=4){first+=4;last +=4;if (*(first-4) == 0 || *(first-4) != *(last-4)){return(*(unsigned char *)(first-4) - *(unsigned char *)(last-4));}if (*(first-3) == 0 || *(first-3) != *(last-3)){return(*(unsigned char *)(first-3) - *(unsigned char *)(last-3));}if (*(first-2) == 0 || *(first-2) != *(last-2)){return(*(unsigned char *)(first-2) - *(unsigned char *)(last-2));}if (*(first-1) == 0 || *(first-1) != *(last-1)){return(*(unsigned char *)(first-1) - *(unsigned char *)(last-1));}}}/* residual loop */for (; x < count; x++){if (*first == 0 || *first != *last){return(*(unsigned char *)first - *(unsigned char *)last);}first+=1;last+=1;}return 0;
}
第一个if语句,如果count==0那么就不用比较了,因为比较的区间没有。
第二个if语句只是将区间划分成[0,4]和(4,正无穷)讨论
之后的语句就是把每个每个字符进行比较,返回比较的结果。
相关文章:

C语言函数:字符串函数及模拟实现strncpy()、strncat()、strncmp()
C语言函数:字符串函数及模拟实现strncpy()、strncat()、strncmp() 在了解strncpy、strncat()、前,需要先了解strcpy()、strncat(): C语言函数:字符串函数及模拟实现strlen() 、strcpy()、 strcat()_srhqwe的博客-CSDN博客 strncp…...
学术论文插图要求简介
1. 类型 位图和矢量图是两种不同的图像类型,它们在存储和处理图像时使用不同的方法。以下是它们之间的详细区别: 图像构成方式:位图使用像素(或图像的最小单元)来构建图像,每个像素都有自己的颜色和亮度值。…...
【独家】华为OD机试 - 斗地主 2(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...

力扣-计算特殊奖金
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:1873. 计算特殊奖金二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总…...
华为校招机试真题目录
专栏介绍 本专栏将逐步收集历年华为校招算法真题 专栏权益 每篇博客都包含: 算法考点解析(文字+画图)算法源码(支持 Java / JS / Python)每晚9:00 ~ 11:00 在线答疑 真题目录 时间题目考点 or 实现2022.11.27...

EdgeYOLO学习笔记
EdgeYOLO学习笔记 EdgeYOLO: An Edge-Real-Time Object Detector Abstract 本文基于最先进的YOLO框架,提出了一种高效、低复杂度、无锚的目标检测器,该检测器可以在边缘计算平台上实时实现。为了有效抑制训练过程中的过拟合,我们开发了一种…...
【分布式】什么是分布式锁?正文揭晓
分布式锁的概念 分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。 举个例子:假设共享的资源就是一个房子,里面有各种书,分布式系统就是要进屋看书的人, 分布式锁…...

超详细JDK1.8所有版本下载地址
JDK1.8即为JDK8,JDK8是目前是最成熟最稳定的版本,本文将详细介绍JDK1.8历史版本的下载方式。 在此附上JDK1.8安装与配置教程 超详细JDK1.8安装与配置 一、JDK官网 首先打开oracle官网,官网首页地址为 JDK官网首页地址 点击Products 点击…...

论文解析[11] CAT: Cross Attention in Vision Transformer
发表时间:2021 论文地址:https://arxiv.org/abs/2106.05786v1 文章目录摘要3 方法3.1 总体结构3.1.1 Inner-Patch Self-Attention Block3.1.2 Cross-Patch Self-Attention Block3.1.3 Cross Attention based Transformer结论摘要 使用图像patch来替换tr…...

嵌入式和Python(一):python环境搭建的详细步骤
目录 ● 安装python ① 更新软件列表 ② 安装编译python需要用到的环境 ③ 下载python源码 ④ 解压源码包 ⑤ 配置 ⑥ 编译 ⑦ 安装 ● 建立软连接 说明 ① 删除原来的软连接 ② 在/usr/bin/目录创建软连接python,定向/usr/local/bin/python3.9 ③ 检查…...

嵌入式学习笔记——STM32硬件基础知识
STM32开发硬件知识前言单片机参数主频位数STM32最小系统电源电路晶振电路复位电路BOOT选择电路调试接口电路其他电路本文重点本文参考博客链接前言 上一篇中我们重点是讲了一下怎么搭建开发环境以及怎么下载烧录的过程,这都是解决的电脑端的开发环境问题࿰…...

Mybatis插件开发及执行原理
mybatis源码下载 https://github.com/mybatis/mybatis-3,本文分析源码版本3.4.5 mybatis启动大致流程 在看这篇文章前,建议查看我另一篇文章,以了解框架启动的流程和框架中一些重要对象:https://blog.csdn.net/Aqu415/article/…...
vue父子组件通信,兄弟组件通信
目录 一、父子组件通信 1、子组件通过 props 获取父组件变量和父组件调用子组件中的方法(这两个都是父传子的思想) a:子组件通过 props 获取父组件变量 b:父组件调用子组件中的方法 2、父组件通过ref获取子组件变量和子组件调用父组件的方法(这两个都是子传父的…...

大数据技术之Hadoop集群配置
作者简介:大家好我是小唐同学(๑><๑),好久不见,为梦想而努力的小唐又回来了,让我们一起加油!!! 个人主页:小唐同学(๑><๑)的博客主页 目前…...

MicroBlaze系列教程(7):AXI_SPI的使用(M25P16)
文章目录 AXI_SPI简介MicroBlaze硬件配置常用函数使用示例波形实测参考资料工程下载本文是Xilinx MicroBlaze系列教程的第7篇文章。 AXI_SPI简介 Xilinx AXI-SPI IP共有两个:一个是标准的AXI_SPI,即4线制SPI,CS、SCLK、MOSI和MISO,另一个是AXI_Quad SPI,支持配置成标准SP…...

使用Python通过拉马努金公式快速求π
使用Python通过拉马努金公式快速求π 一、前言 π是一个数学常数,定义为:圆的周长与直径的比值。 π是一个无理数,也是一个超越数,它的小数部分无限不循环。 π可以用来精确计算圆周长、圆面积、球体积等几何形状的关键值。 有关…...
第六章 使用系统类提供国家语言支持 - 创建自定义语言环境
文章目录第六章 使用系统类提供国家语言支持 - 创建自定义语言环境创建自定义语言环境第六章 使用系统类提供国家语言支持 - 创建自定义语言环境 创建自定义语言环境 此示例将提供一个模板,用于使用自定义表创建自定义语言环境。自定义表将在 EBCDIC(美…...
「题解」解决二进制数中1的个数
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练 🔥座右铭:“不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错…...

泛型详解.
1 泛型的引入 问题:我们之前实现过的顺序表,只能保存 int 类型的元素,如果现在需要保存 指向 Person 类型对象的引用的顺序表,请问应该如何解决?如果又需要保存指向 Book 对象类型的引用呢? 之前写的顺序表…...
Vue 3.0 响应性 深入响应性原理 【Vue3 从零开始】
现在是时候深入了!Vue 最独特的特性之一,是其非侵入性的响应性系统。数据模型是被代理的 JavaScript 对象。而当你修改它们时,视图会进行更新。这让状态管理非常简单直观,不过理解其工作原理同样重要,这样你可以避开一…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...