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.mfbz.cn/a/881142.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【专题】2024新能源企业“出海”系列之驶向中东、东南亚报告合集PDF分享(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p37698 在“双碳”目标引领下&#xff0c;中国新能源产业近年迅猛发展&#xff0c;新能源企业凭借技术革新、政策支持与市场驱动实现快速增长&#xff0c;在产业链完备、技术领先、生产效能及成本控制等方面优势显著。面对国内外环境…

MySQL中的LIMIT与ORDER BY关键字详解

前言 众所周知&#xff0c;LIMIT和ORDER BY在数据库中&#xff0c;是两个非常关键并且经常一起使用的SQL语句部分&#xff0c;它们在数据处理和分页展示方面发挥着重要作用。 今天就结合工作中遇到的实际问题&#xff0c;回顾一下这块的知识点。同时希望这篇文章可以帮助到正…

ZXing.Net:一个开源条码生成和识别器,支持二维码、条形码等

推荐一个跨平台的非常流行的条码库&#xff0c;方便我们在.Net项目集成条码扫描和生成功能。 01 项目简介 ZXing.Net是ZXing的.Net版本的开源库。支持跨多个平台工作&#xff0c;包括 Windows、Linux 和 macOS&#xff0c;以及在 .NET Core 和 .NET Framework 上运行。 解码…

【数据结构】设有一带头结点的单链表,编程将链表颠倒过来。要求不用另外的数 组或结点完成。

编程题&#xff1a; 设有一带头结点的单链表&#xff0c;编程将链表颠倒过来。要求不用另外的数 组或结点完成。 分析&#xff1a; 该算法通过维护三个指针&#xff08;prev、curr 和 next&#xff09;逐步遍历单链表&#xff0c;实现链表的逆转。在遍历过程中&#xff0c;cur…

IDEA Cody 插件实现原理

近年来&#xff0c;智能编程助手 在开发者日常工作中变得越来越重要。IDEA Cody 插件是 JetBrains 生态中一个重要的插件&#xff0c;它可以帮助开发者 快速生成代码、自动补全、并提供智能提示&#xff0c;从而大大提升开发效率。今天我们将深入探讨 Cody 插件的实现原理&…

技术成神之路:设计模式(十四)享元模式

介绍 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构性设计模式&#xff0c;旨在通过共享对象来有效地支持大量细粒度的对象。 1.定义 享元模式通过将对象状态分为内部状态&#xff08;可以共享&#xff09;和外部状态&#xff08;不可共享&#xff09;&#xf…

AI免费UI页面生成

https://v0.dev/chat v0 - UI设计 cursor - 编写代码 参考&#xff1a;https://www.youtube.com/watch?vIyIVvAu1KZ4 界面和claude类似&#xff0c;右侧展示效果和代码 https://pagen.so/

【重学 MySQL】三十、数值类型的函数

【重学 MySQL】三十、数值类型的函数 基本函数角度与弧度互换函数三角函数指数与对数进制间的转换示例 基本函数 MySQL提供了一系列基本的数值函数&#xff0c;用于处理数学运算和数值转换。以下是一些常用的基本函数及其用法&#xff1a; 函数用法ABS(x)返回x的绝对值。SIGN…

[docker]入门

本文章主要讲述的是&#xff0c;docker基本实现原理&#xff0c;docker概念的解释&#xff0c;docker的使用场景以及docker打包与部署的应用。 文章中docker所运行的系统&#xff1a;CentOS Linux release 7.9.2009 (Core) 目录 docker是什么&#xff0c;什么时候需要去使用 …

【Mysql-索引总结】

文章目录 什么是索引索引类型索引的数据结构Hash索引有序数组二叉搜索树平衡二叉树B树B索引 索引使用规则索引失效的情况如何选择正确的列进行索引&#xff1f; 什么是索引 索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构&#xff0c;它是某个表中…

无人机黑飞打击技术详解

随着无人机技术的普及&#xff0c;无人机“黑飞”&#xff08;未经授权或违反规定的飞行&#xff09;现象日益严重&#xff0c;对公共安全、隐私保护及重要设施安全构成了严重威胁。为有效应对这一挑战&#xff0c;各国政府和安全机构纷纷研发并部署了一系列无人机黑飞打击技术…

基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示,设置电流阈值为80,电流小阈值为50,电压阈值为60,温度阈值为30 随便哪个超过预祝,则继电器切断,LE…

战神5/战神:诸神黄昏/God of War Ragnarok

版本介绍 v1.0.612.4312|容量175GB|官方简体中文|支持键盘.鼠标.手柄|赠单板学习补丁 配置要求 战神5/战神&#xff1a;诸神黄昏/God of War Ragnarok 游戏介绍 不灭的北欧传奇 由Santa Monica Studio出品、Jetpack Interactive负责PC移植的佳作《God of War Ragnark》将带您…

网络设备登录——《路由与交换技术》实验报告

目录 一、实验目的 二、实验设备和环境 三、实验记录 1.通过 Console 登录 步骤1:连接配置电缆。 步骤2:启动PC,运行超级终端。 步骤3:进入Console 配置界面 2.通过 Telnet 登录 步骤1:通过 Console 接口配置 Telnet 用户。 步骤2:配置 super 口令 步骤3:配置登录欢迎…

Java之封装

文章目录 1.封装1.1 什么是封装1.2 访问限定符1.3 包1.3.1 什么是包1.3.2 导包1.3.3 自定义包 2. static2.1 static 修饰成员变量2.2 static 修饰成员方法2.3 static成员变量初始化 3. 代码快3.1 普通代码块3.2 实例代码块3.3 静态代码块 4. 对象的打印 1.封装 1.1 什么是封装…

ubuntu安装emqx

目录 1.预先下载好emqx压缩包 2.使用tar命令解压 3.进入bin目录 5.放开访问端口18083 6.从通过ip地址访问emqx后台 7.默认用户名密码为admin/public 8.登录后台 9.资源包绑定在此博文可自取 1.预先下载好emqx压缩包 2.使用tar命令解压 sudo tar -xzvf emqx-5.0.8-el8-…

monorepo基础搭建教程(从0到1 pnpm+monorepo+vue)

monorepo 前言1、搭建空项目并配置pnpm-workspace.yamlpnpm initpnpm-workspace.yaml 2.配置packages测试文件配置相关内容 3.引入packages内容至公共package.json4.创建测试项目&#xff0c;并引入公共包结语 前言 有个项目要引入一个第三方库&#xff0c;但是第三方库下载下…

LabVIEW提高开发效率技巧----使用快捷键

在LabVIEW的开发过程中&#xff0c;熟练掌握和运用快捷键可以极大地提升工作效率&#xff0c;减少重复性操作所花费的时间。快捷键不仅可以加快编程速度&#xff0c;还能让开发者更加专注于逻辑实现和功能设计。细问问将详细介绍LabVIEW中的常用快捷键&#xff0c;特别是强大的…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【时间管理】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

YOLOv8改进系列,YOLOv8替换主干网络为PP-HGNetV2(百度飞桨视觉团队自研,助力涨点)

摘要 PP-HGNetV2(High Performance GPU Network V2) 是百度飞桨视觉团队自研的 PP-HGNet 的下一代版本,其在 PP-HGNet 的基础上,做了进一步优化和改进,最终在 NVIDIA GPU 设备上,将 “Accuracy-Latency Balance” 做到了极致,精度大幅超过了其他同样推理速度的模型。其在…