C语言strncpy的使用缺陷和实现,strncat的使用缺陷和实现,strncmp的使用和实现。

news2024/9/21 12:37:46

1.strncpy

函数原型:

char *strncpy( char *strDest, const char *strSource, size_t count );
  • char *strDest 目标字符串首元素地址
  • const char *strSource 源字符串(需要拷贝过去的字符串)
  • size_t count 拷贝字符的个数
  • char *strncpy 拷贝结束后,返回目标字符串的起始地址,方便函数的链式访问

函数作用:
拷贝 count 个字符从源字符串到目标空间。如果源字符串的长度小于 count,则拷贝完源字符串之后,在目标后边追加 '\0',直到 count 个。

函数的使用

#include <stdio.h>
#include <string.h>

int main() {

	char str1[] = "abcdfxxxxxxx";
	char str2[] = "qwe";
	printf("%s", strncpy(str1, str2, 3));

	return 0;
}

函数的注意事项:
1.strncpy 拷贝的时候指定的 count 小于源字符串的长度时,strncpy 是不会拷贝 '\0' 的。
2.如果源字符串的长度小于 count,则拷贝完源字符串之后,在目标后边追加 '\0',直到count个。
3.strncpy 相对于 strcpy 函数相对安全,但如果目标字符串的空间没有比源字符串空间大,还是会造成程序异常崩溃。

函数的模拟实现:

#include <assert.h>

char* _strncpy(
	char* dest,
	const char* src,
	size_t count
) {
	assert(dest != NULL && src != NULL);

	char* temp = dest;

	while (count) {
		if (*src) {
			*dest++ = *src++;
		}
		else {
			*dest++ = '\0';
		}
		count--;
	}

	return temp;
}

2.strncat

函数原型:

char *strncat( char *strDest, const char *strSource, size_t count );
  • char *strDest 目标字符串首元素地址
  • const char *strSource 源字符串(需要追加过去的字符串)
  • size_t count 追加字符的个数
  • char *strncat 追加结束后,返回目标字符串的起始地址,方便函数的链式访问

函数作用:
追加 count 个字符从目标字符串'\0'的位置开始追加。如果count小于源字符串的长度,那么追加结束后会主动添加'\0'。如果count大于源字符串的长度,则strncat等价于strcat

函数的使用

#include <stdio.h>
#include <string.h>

int main() {
	char str1[20] = "hello\0##########";
	char str2[] = "qwe";
	printf("%s", strncat(str1, str2 , 6)); // count大于str2的长度,所以这里strncat等价于strcat

	return 0;
}

在这里插入图片描述


#include <stdio.h>
#include <string.h>

int main() {

	char str1[20] = "hello\0##########";
	char str2[] = "qwe";
	printf("%s", strncat(str1, str2, 2)); // count小于字符串长度,追加过去之后会添加'\0'

	return 0;
}

在这里插入图片描述

函数的注意事项:
1.如果count小于源字符串的长度,那么追加结束后会主动添加'\0'
2.如果count大于源字符串的长度,则strncat等价于strcat
3.strncat 相对于 strcat 函数相对安全,但如果目标字符串的空间没有比源字符串空间大,还是会造成程序异常崩溃。
4.目标字符串中要有'\0',因为strncat是从目标字符串'\0'的位置开始追加。
5.源字符串中也有'\0',当count大于源字符串的长度,strncat 会把源字符串全部追加过去,没有'\0'的话,会造成越界访问。
6.strncat可以自己追加自己。

函数的模拟实现

#include <assert.h>

char* _strncat(
	char* dest,
	const char* src,
	size_t count
) {
	assert(dest != NULL && src != NULL);

	char* temp = dest;

	while (*dest) {
		dest++;
	}

	while ((count--) && (*src) && (*dest++ = *src++));

	*dest = '\0';

	return temp;
}

3.strncmp

函数原型:

int strncmp( const char *string1, const char *string2, size_t count );
  • const char *string1 是第一个字符串的起始地址
  • const char *string2 是第二个字符串的起始地址
  • size_t count 比较的个数
  • int strncmp 返回一个整型
    • > 0 说明第一个字符串大于第二个字符串
    • < 0 说明第一个字符串小于第二个字符串
    • = 0 说明两个字符串相等

函数作用: 判断两个字符串在count的范围是否相等。

函数的模拟实现

int _strncmp(
	const char* string1,
	const char* string2,
	size_t count
) {
	assert(string1 && string2);
	while ( (count) && (*string1 == *string2) && (*string1) && (*string2)) {
		string1++;
		string2++;
		count--;
	}
	
	return (count ? *string1 - *string2 : *(string1 - 1) - *(string2 - 1));
}

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

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

相关文章

Micormeter实战

Micrometer 为基于 JVM 的应用程序的性能监测数据收集提供了一个通用的 API&#xff0c;支持多种度量指标类型&#xff0c;这些指标可以用于观察、警报以及对应用程序当前状态做出响应。 前言 可接入监控系统 监控系统的三个重要特征&#xff1a; 维度&#xff08;Dimensio…

[保姆教程] Windows平台OpenCV以及它的Golang实现gocv安装与测试(亲测通过)

一、MinGW & CMake 预备步骤 首先打开cmd: c: md mingw-w64 md cmake下载安装MinGW-W64 访问&#xff1a; https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/7.3.0/ 下载&#xff1a; MinGW-W64 GCC-8…

一文详解Softmax的性质与Self-Attention初步解析

概述 最近研究超平面排列(Hyperplane Arrangement)问题的时候&#xff0c;发现ReLU有其缺陷&#xff0c;即举例来说&#xff0c;ReLU 无法使用单一的超平面将分离的所有数据&#xff0c;完整的输出&#xff0c;即只会输出半个空间映射的数据&#xff0c;而另一半空间的数据被置…

面试---简历

项目 1.1、商品管理 新增商品 同时插入商品对应的使用时间数据&#xff0c;需要操作两张表&#xff1a;product&#xff0c;product_usetime。在productService接口中定义save方法&#xff0c;该方法接受一张Dto对象&#xff0c;dto对象继承自product类&#xff0c;并将prod…

学习open62541 --- [78] 单线程和多线程的使用场景

open62541提供多线程功能&#xff0c;默认不开启&#xff0c;即单线程&#xff0c; 把UA_MULTITHREADING的值设置为 > 100就可以开启多线程了。 这里单线程/多线程的意思是基于open62541运行的server内部是否使用锁去保护数据。只要server运行后还有读写操作需要做&#x…

从源码全面解析 dubbo 消费端服务调用的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

3D 顶点着色与Phong 反射模型

Phong 反射模型有时被称为“Phong 照明”或“Phong 照明”。它由环境光照、漫反射&#xff08;朗伯反射&#xff09;、镜面反射三部分组成。 Phong 反射模型提供了一个方程式&#xff0c;用于计算表面上每个点的光照&#xff0c;I_p&#xff1a; 第一部分代表环境光项。在GLSL代…

X书hmac参数

被删重新发送 全文可以查看&#xff1a; 上面一遍unidbg解密shield文章 unidbg - 》 callObjectMethodV方法填写你的小红书路径下s.xml里的值: 或者在抓包响应头中: 查找xy-ter-str hmac 结果都是在&#xff0c;响应头里&#xff0c;所以 hmac 是服务器下发给客户端的. Over…

黑马头条.

文章目录 前言一、项目概述1.1 能收获什么1.2 项目概述1.3 项目术语1.4 业务说明 二、技术栈2.1技术栈整体框架图2.2技术栈简介 三、nacos环境搭建3.1 虚拟机镜像准备3.2 nacos的安装 四、初始工程搭建4.1 开发环境准备 五、实现登录功能5.1 需求分析5.2 表结构分析5.3 思路分析…

22道常见RocketMQ面试题以及答案

面试宝典到手&#xff0c;搞定面试&#xff0c;不再是难题&#xff0c;系列文章传送地址&#xff0c;请点击本链接。 1、RocketMQ是什么? 2、RocketMQ有什么作用&#xff1f; 3、RoctetMQ的架构 4、RoctetMQ的优缺点 8、消息过滤,如何实现&#xff1f; 9、消息去重,如果…

Elasticsearch 基本使用(四)聚合查询

聚合查询 概述单字段聚合查询统计分组后的数量非文档字段分组文档字段分组 其他聚合运算统计平均值统计总金额统计最大值自定义聚合结果排序简单聚合小结 多字段聚合查询 概述 说到聚合查询&#xff0c;马上会想到 SQL 中的 group by&#xff0c;ES中也有类似的功能&#xff0…

编程语言发展历史

文章目录 语言的发展时间轴语言世代时间轴1940年前-机器语言时代1940年后-汇编语言时代1950年-高级语言的初生1960年-高级语言的进一步成熟1980年-各大语言的进一步增强1990年代-飞速发展时代2000年-新时代 高级编程语言的分类解释型与编译型面向过程与面向对象 对语言的评价Ti…

【学习学习】NLP理解层次模型

NLP&#xff08;Neuro-Linguistic Programming&#xff0c;神经语言程序学&#xff09;&#xff0c;由两位美国人理查得.班德勒&#xff08;Richard Bandler&#xff09;与约翰.葛瑞德&#xff08;John Grinder&#xff09;于1976年创办&#xff0c;并在企业培训中广泛使用。美…

PyTorch 深度学习 || 4. 自编码网络 | Ch4.3 卷积自编码网络图像去噪

卷积自编码网络图像去噪 1. 数据的准备 先简单介绍一下训练网络使用到的图像数据集——STL10&#xff0c;该数据集可以通过torchvision.datasets模块中的STL10()函数进行下载&#xff0c;该数据集共包含三种类型数据,分别是带有标签的训练集和验证集&#xff0c;分别包含5000…

Cookie增删改查方法封装(低内存开销版)

本文章中的低内存开销是指在获取cookie的时候不进行字符串—>数组的转变&#xff0c;全程使用sliceindexOf切割字符串&#xff0c;不创建和操作数组&#xff0c;节约内存&#xff0c;本文代码已存放到github中&#xff0c;后续会持续完善功能&#xff0c;传送门&#xff1a;…

二进制方式部署kubernetes集群

二进制方式部署kubernetes集群 1、部署k8s常见的几种方式 1.1 kubeadm Kubeadm 是一个 k8s 部署工具&#xff0c;提供 kubeadm init 和 kubeadm join&#xff0c;用于快速部署 Kubernetes 集群。 Kubeadm 降低部署门槛&#xff0c;但屏蔽了很多细节&#xff0c;遇到问题很难…

掌握Python的X篇_4_开发工具ipython与vscode的安装使用

本篇将会介绍两个工具的安装及使用来提高Python的编程效率。 ipython&#xff1a;比python更好用的交互式开发环境vscode&#xff1a;本身是文本编辑器&#xff0c;通过安装相关的插件vscode可以作为python集中开发环境使用 掌握Python的X篇_4_开发工具ipython与vscode的安装使…

第四章 linux编辑器——vim的使用

第四章 linux编辑器——vim的使用 一、什么是vim&#xff1f;二、vim的基本操作1、模式之间的相互切换2、vim的常见命令集&#xff08;1&#xff09;正常模式的常见命令a. 模式切换b. 光标移动c.删除文字d.复制e.替换f.撤销g.更改 &#xff08;2&#xff09;底行模式的常见命令…

复习之linux的网络配置

一、基本定义 1.IP IP指网际互连协议&#xff0c;Internet Protocol的缩写&#xff0c;是TCP/IP体系中的网络层协议。 电脑之间要实现网络通信&#xff0c;就必须要有一个合法的ip地址。 IP地址网络地址主机地址&#xff08;又称&#xff1a;主机号和网络号组成&#xff09…

【MySQL】MyISAM中的索引方案

介绍 B树索引使用存储引擎如表所示&#xff1a; 索引/存储引擎MyISAMInnoDBMemoryB树索引支持支持支持 多个存储引擎支持同一种类型的索引&#xff0c;但是他们的实现原理是不同的。 InnoDB和MyISAM默认的索引是B树索引&#xff0c;而Memory默认的索引是Hash索引。 MyISAM…