54.【C语言】 字符函数和字符串函数(strncpy,strncat,strncmp函数)

和strcpy,strcat,strcmp函数对应的是strncpy,strncat,strncmp函数

8.strncpy函数

*简单使用

cplusplus的介绍 点我跳转

翻译:

函数

strncpy


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

从字符串中复制一些字符

复制源(source)字符串的前num个字符到目标(destination)字符串中.如果在复制num个字符之前遇到了源字符串的末尾(由\0指示),那么之后会有由\0来填充直到复制完所有的num个字符.

如果源字符串的字符个数大于num,则不会在目标字符串的末尾追加隐含的\0

因此在这种情况下,目标字符串不应该只包含\0(这样读取会溢出)

如:

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = { "Hello World!" };char arr2[1] = {"\0"};strncpy(arr2, arr1, 5);printf("%s", arr2);return 0;
}

目标和源的地址不应该重叠(参见memmove,了解重叠时更安全的替代方案)

参数


目标(destination):指向目标数组(接收复制的内容)的指针

源(source):要被复制的字符串

个数(num):从源中最多需要复制的字符个数

size_t是无符号整型

返回值:


目标已返回

与strcpy相比,strncpy多了一个num参数(源中最多要拷贝的字符个数,类型为size_t

 可以指定拷贝字符的个数

例如:

将arr1的前5个字符复制到arr2中,打印arr2

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] =  { "Hello World!" };char arr2[20] = { 0 };strncpy(arr2, arr1, 5);printf("%s", arr2);return 0;
}

例如:

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] =  { "Hello World!" };char arr2[20] = { "xxxxxxxxxxxxxxxxxxx"};strncpy(arr2, arr1, 15);printf("%s", arr2);return 0;
}

*例题

求下列代码的打印结果

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = { "H\0ello World!" };char arr2[20] = { 0 };strncpy(arr2, arr1, 5);printf("%s", arr2);return 0;
}

答案速查:

分析:

上方的翻译表述

其实画红线处隐晦表明源字符串的第一个\0

9.strncat函数

*简单使用

cplusplus网的介绍,点我跳转

翻译:

函数

strncat


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

从字符串中追加字符

源(source)的前num个字符追加到目标(destination)中,再加一个\0字符

如果字符串的字符个数小于num个,则只复制\0之前(包含\0本身)的内容

参数


目标(destination):指向包含字符串的目标数组的指针,而且该数组空间足够大来容纳追加的字符串,包含\0

源(source):要追加的字符串

个数(num):

从源中最多需要复制的字符个数

size_t是无符号整型

返回值:


目标已返回

之前在52.【C语言】 字符函数和字符串函数(strcat函数)说过,strcat函数在使用中,特别提醒了字符串不能自己追加自己,但strncat函数可以实现

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = { "Hello" };strncat(arr1, arr1, 5);printf("%s", arr1);return 0;
}

*例题

求下列代码执行后arr1数组元素的情况

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = { "Hello\0xxxxxxxxxxxxx" };char arr2[20] = { " World!" };strncat(arr1, arr2, 10);printf("%s", arr1);return 0;
}

答案速查:

显然并没有一直追加\0

分析:见cplusplus的翻译

10.strncmp函数

*简单使用

cplusplus的介绍 点我跳转

翻译

函数

strncmp


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

比较两个字符串的长度

最多比较str1指向的字符串和str2指向的字符串的num个字符

这个函数从比较两个字符串的第一个字符开始,如果他们之间相等(ASCII码值一样),该函数会继续成对比较直到这些情况有一个先发生为止:

① 两个字符串的成对字符出现差异

② 遇到了\0

③ 两个字符串的每对字符之间都相等

参数


str1:指向需要比较的字符串

str2:指向需要比较的字符串

num:最多需要比较的字符个数

size_t是无符号整型

返回值


返回整型数字来表明两个字符串之间的关系

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = { "Hello" };char arr2[20] = { "Hela" };int ret = strncmp(arr1, arr2, 3);printf("%d", ret);return 0;
}

比较前3个字符,返回0

介绍完strncpy,strncat,strncmp函数,与strcpy,strcat,strcmp函数对比发现:strncpy,strncat,strncmp函数较安全,因为有num长度的限制

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

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

相关文章

LeetCode题集-4 - 寻找两个有序数组的中位数,图文并茂,六种解法,万字讲解

题目&#xff1a;给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 作为目前遇到的第一个困难级别题目&#xff0c;我感觉这题还是挺难的&#xff0c…

Linux常用命令以及操作技巧

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明帮助命令常见的七个linux操作终端实用的技巧跟文件目录…

idea集成和使用Git指南

前言 Git是一个分布式的版本控制工具&#xff0c;可以管理我们开发过程中的源代码文件&#xff0c;而idea是Java的集成开发环境&#xff0c;在idea中配置Git&#xff0c;可以提高我们的团队开发效率。因此在idea中集成Git并使用Git管理我们的源代码是必要的 第一步&#xff1a;…

计算机毕业设计python校园物资招标投标竞标系统 w235g

目录 技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取 技术栈和环境说明 本系统以Python开发语言开发&am…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 死亡对象判断方法

文章目录 垃圾回收机制死亡对象判断方法引用计数法可达性分析算法可以作为 GC Roots 的对象判断对象被回收需要经历的过程 引用类型引用汇总引用队列 废弃常量判定废弃常量废弃原因遵循原则 无用的类所需条件造成的问题解决步骤 垃圾回收机制 垃圾回收&#xff08;Garbage Col…

【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)

目录 一、插入排序 算法思想 二、插入排序 算法步骤 四、复杂度分析 时间复杂度&#xff1a;O(n^2) 空间复杂度&#xff1a;O(1) 稳定性&#xff1a;稳定算法 五、应用场景 &#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;探索数据结构…

STM32之FMC—扩展外部 SDRAM

文章目录 一、FMC外设介绍二、SDRAM 控制原理1、SDRAM关键参数a、容量、分区b、引脚SDRAM 使用 2、SDRAM芯片IS42S16400J3、SDRAM 控制引脚说明控制逻辑地址控制SDRAM 的存储阵列SDRAM 的命令预充电刷新 W9825G6KH&#xff1a;W9825G6KH引脚 三、STM32F429 FMC四、其他文章打开…

基于ssm的个性化影片推荐系统设计与实现

需要项目源码请联系我&#xff0c;目前有各类成品 毕设 javaweb ssh ssm springboot等等项目框架&#xff0c;源码丰富。 专业团队&#xff0c;咨询就送开题报告&#xff0c;活动限时免费&#xff0c;有需要的朋友可以来咨询。 一、摘要 随着科学技术的飞速发展&#xff0c;社…

Matlab simulink建模与仿真 第十五章(信号源库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号源库中的模块概览 注&#xff1a;部分模块在第二章中有介绍&#xff0c;本章不再赘述。 二、from输入源模块 1、From Workspace模块 &#xff08;1&#xff09;该模块可从MATLAB工作区、模型工作区…

双指针算法专题(2)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 想要了解双指针算法的介绍&#xff0c;可以去看下面的博客&#xff1a;双指针算法的介绍 目录 611.有效三角形的个数 LCR 1…

King3399 SDK编译简明教程

该文章仅供参考&#xff0c;编写人不对任何实验设备、人员及测量结果负责&#xff01;&#xff01;&#xff01; 0 引言 文章主要介绍King3399&#xff08;瑞芯微rk3399开发板&#xff0c;荣品&#xff09;官方SDK编译过程&#xff0c;涉及环境配置、补丁以及编译过程中注意事…

shiro漏洞复现

目录 shiro介绍框架介绍判断是否使用shiro框架 环境搭建CVE-2010-3863漏洞原理影响版本漏洞复现 CVE-2016-4437漏洞原理影响版本漏洞复现 CVE-2020-1957漏洞原理影响版本漏洞复现 shiro-721拉取环境漏洞原理漏洞复现 shiro介绍 框架介绍 Apache Shiro提供了认证、授权、加密和…

CSARA机械手正反解代码解读和左右手定则应用

前言&#xff1a;前段时间在某鱼上买了一份CSARA的机械臂的程序&#xff0c;拿出来分享一下&#xff0c;并记录一下。说明一下并非是公司的核心代码&#xff0c;我也不搞这个....侵权就删了。 首先简单回顾一下CSARA的正逆解。 根据几何的方法能求出末端在平面坐标系中的xy坐标…

第二百三十五节 JPA教程 - JPA Lob列示例

JPA教程 - JPA Lob列示例 以下代码显示了如何使用Lob注释将字节数组保存到数据库。 LOB在数据库中有两种类型&#xff1a;字符大对象&#xff08;称为CLOB&#xff09;和二进制大对象&#xff08;或BLOB&#xff09;。 CLOB列保存大字符序列&#xff0c;BLOB列可存储大字节序…

Linux memcg lru lock提升锁性能

内核关于per memcg lru lock的重要提交&#xff1a; f9b1038ebccad354256cf84749cbc321b5347497 6168d0da2b479ce25a4647de194045de1bdd1f1d 计算虚拟地址转换基本机制 为了处理多应用程序的地址冲突&#xff0c; linux 系统在应用中使用了虚拟地址&#xff0c;得益于硬件的…

SpringBoot+vue集成sm国密加密解密

文章目录 前言认识SM2后端工具类实现引入依赖代码实现工具类&#xff1a;SM2Util 单元测试案例1&#xff1a;生成服务端公钥、私钥&#xff0c;前端js公钥、私钥案例2&#xff1a;客户端加密&#xff0c;服务端完成解密案例3&#xff1a;服务端进行加密&#xff08;可用于后面前…

禹神:一小时彻底搞懂跨域解决方案

1. 浏览器的同源策略 2. 跨域会受到哪些限制 4. CORS 解决 Ajax 跨域问题 exposedHeaders 不加这个&#xff0c;js拿不到这个响应头(浏览器控制台network中能看见&#xff0c;但是js拿不到) 5. JSONP 解决跨域问题 JSOP只能解决get请求 服务端代码 客户端代码 服务端代码升…

卡尔曼滤波中Q和R与噪声的关系

卡尔曼滤波 一种用于估计系统状态的递归滤波器&#xff0c;通过融合传感器测量和系统模型&#xff0c;提供系统状态的最优估计。 Q和R是什么 在卡尔曼滤波中&#xff0c;Q和R分别表示过程噪声和测量噪声的协方差矩阵。 Q Q Q矩阵&#xff08;过程噪声协方差矩阵&#xff09;…

LC并联电路在正弦稳态下的传递函数推导(LC并联谐振选频电路)

LC并联电路在正弦稳态下的传递函数推导&#xff08;LC并联谐振选频电路&#xff09; 本文通过 1.解微分方程、2.阻抗模型两种方法推导 LC 并联选频电路在正弦稳态条件下的传递函数&#xff0c;并通过仿真验证不同频率时 vo(t) 与 vi(t) 的幅值相角的关系。 电路介绍 已知条件…

人工智能和大模型的简介

文章目录 前言一、大模型简介二、大模型主要功能1、自然语言理解和生成2、文本总结和翻译3、文本分类和信息检索4、多模态处理三、大模型的技术特性1、深度学习架构2、大规模预训练3、自适应能力前言 随着技术的进步,人工智能(Artificial Intelligence, AI)和机器学习(Mac…