当前位置: 首页 > news >正文

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长度的限制

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 大厂程序员的健身之路
  • Mybatis-plus进阶篇(五)
  • 探索Docker:轻松进入容器并运行命令的实用指南
  • MYSQL表操作
  • powerbi-L8-导入数据时候的动态列
  • Vue3:实现div拖拽
  • 算法打卡:第十一章 图论part02
  • Flask + Swagger 完整指南:从安装到配置和注释
  • 品牌力是什么?如何评估企业品牌影响力?
  • Java、JS与Go的扩展操作符,揭秘它们的‘魔法’!
  • Python编码系列—Python代理模式:为对象赋予超能力的魔法
  • sqlgun靶场训练
  • Scrapy爬虫框架 Items 数据项
  • Linux——K8s集群部署过程
  • C++速通LeetCode中等第7题-和为K的子数组(巧用前缀和)
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • es6(二):字符串的扩展
  • hadoop集群管理系统搭建规划说明
  • JavaScript学习总结——原型
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Vue全家桶实现一个Web App
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 浏览器缓存机制分析
  • 如何合理的规划jvm性能调优
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 小程序01:wepy框架整合iview webapp UI
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​一些不规范的GTID使用场景
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Java NIO(一)FileChannel
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #QT项目实战(天气预报)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Java入门)抽象类,接口,内部类
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (二开)Flink 修改源码拓展 SQL 语法
  • (翻译)terry crowley: 写给程序员
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • .NET C# 操作Neo4j图数据库
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .Net 知识杂记
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • @31省区市高考时间表来了,祝考试成功
  • @Data注解的作用
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ Python ]使用Charles对Python程序发出的Get与Post请求抓包-解决Python程序报错问题