详解C语言string.h中常见的14个库函数(二)

news/2024/10/30 9:32:45/

string.h中的库函数

本篇博客继续讲解string.h中的库函数。在上一篇博客中,我介绍了strlen, strcpy, strcat, strcmp这4个字符串操作函数,本篇博客会继续介绍strncpy, strncat, strncmp这3个类似的函数。

strcpy, strcat, strcmp这3个函数是长度不受限制的字符串操作函数,而strncpy, strncat, strncmp则是对应的3个长度受限制的字符串操作函数。这个“长度受限制”应该如何理解呢?

对于strcpy, strcat, strcmp这3个函数,有一个共同的特点,操作字符串时,只看字符串的结束标志,即\0,所以说它们是长度不受限制的。

  • strcpy会一直拷贝源字符串,直到遇到源字符串结尾的\0
  • strcat会一直追加源字符串到目标字符串后面,直到遇到源字符串结尾的\0
  • strcmp在比较2个字符串时,如果一直相同,会一直向后比较,直到某一个字符串遇到了\0

如果是“长度受限制”的函数,应该是:

  • strncpy可以指定拷贝多少个字符。
  • strncat可以指定最多追加多少个字符。
  • strncmp可以指定最多比较多少个字符。

下面我一一详细介绍。

strncpy

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

strncpy和strcpy都是用来拷贝字符串的,但是strncpy多了第3个参数:num。num代表拷贝的字符的个数,不管源字符串长度是多少,一律拷贝num个字符过去,如果不够就用\0补齐。

比如:

char arr1[20] = "xxxxxxxxxx";
char arr2[] = "abcde";
  1. strncpy(arr1, arr2, 4);会把abcd拷贝过去。
  2. strncpy(arr1, arr2, 5);会把abcde拷贝过去,不拷贝\0
  3. strncpy(arr1, arr2, 6);会把abcde和\0都拷贝过去。
  4. strncpy(arr1, arr2, 7);会把abcde和2个\0拷贝过去。
  5. strncpy(arr1, arr2, 8);会把abcde和3个\0拷贝过去。

下面我在VS2022中分别验证这5种情况。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

strncpy总结:

  1. strncpy会拷贝num个字符,从源字符串到目标空间。
  2. 如果strlen(src)<num,在把src中的字符(不包括结尾的\0)都拷贝到目标空间后,会补\0,直到拷贝字符总数为num。

strncat

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

strncat会在目标字符串后面追加源字符串,最多追加num个字符(不包括\0),然后再追加一个\0以保证目标空间里仍然是一个字符串。

比如:

char arr1[20] = "xxx\0xxxxxxxxxx";
char arr2[] = "abcde";
  1. strncat(arr1, arr2, 4);会追加abcd,再追加\0
  2. strncat(arr1, arr2, 5);会追加abcde,再追加\0
  3. strncat(arr1, arr2, 6);会追加abcde,再追加\0
  4. strncat(arr1, arr2, 7);会追加abcde,再追加\0
  5. strncat(arr1, arr2, 8);会追加abcde,再追加\0

下面我在VS2022中分别验证这5种情况。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
strncat总结:

  1. strncat在完成字符串追加的同时,还可以限定最多追加的字符个数。
  2. strncat的第3个参数表示,最多追加几个字符过去(不包括\0),然后再追加一个\0过去。

strncmp

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

这个函数就很简单了,在字符串比较的基础上,最多比较num对字符。比如:

  1. strncmp("abcdefg", "abcdq", 4);返回0。
  2. strncmp("abcdefg", "abcdq"), 5;返回负数。
  3. strncmp("abcd", "abcd", 10);返回0,只要一个字符串遇到\0就停止比较。
  4. strncmp("abcde", "abcd");返回正数。

strncmp总结:

  1. 比较字符串,且最多比较num对字符。
  2. 如果其中一个字符串遇到\0,另外一个字符串如果也同时遇到\0则2个字符串相等,如果另外一个字符串还没有遇到\0,则提前遇到\0的字符串更小。

总结

  1. strncpy的第3个参数决定了要拷贝多少个字符过去,如果不够就补\0
  2. strncat的第3个参数决定了最多追加多少个字符过去(不包括源字符串结尾的\0),然后再追加一个\0过去。
  3. strncmp的第3个参数决定了最多比较多少对字符,如果比较出了大小,或者其中一个字符串遇到了\0则比较结束。

感谢大家的阅读!


http://www.ppmy.cn/news/47346.html

相关文章

Web 攻防之业务安全:验证码绕过测试.(修改数据包中 res_code 的值 实现绕过.)

Web 攻防之业务安全&#xff1a;验证码绕过测试. 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台&#xff08;操作系统、数据库&#xff0c;中间件等&#xff09;、业务系统自身&#xff08;软件或设备&#xff09;、业务所提供…

利用R语言实现vcf转txt算法,基于vcfR和tidyverse

算法&#xff1a;vcf转txt并自动规范化 引言 vcf文件是存放基因变异信息的一种方式&#xff0c;本文提供一种算法&#xff0c;用于读取vcf文件并转换等位基因展示方法、替换染色体展示格式、以及自动识别非唯一变异并进行修改&#xff0c;用于对变异信息进行整理。 主要步骤与设…

测试5年,从纯手工测试到测试开发,我是怎么拿到腾讯25koffer的?

什么都做了&#xff0c;和什么都没做其实是一样的&#xff0c;走出“瞎忙活”的安乐窝&#xff0c;才是避开弯路的最佳路径。希望我的经历能帮助到有需要的朋友。 在测试行业已经混了5个年头了&#xff0c;以前经常听到开发对我说&#xff0c;天天的点点点有意思没&#xff1f…

Java工程行业管理系统源码-专业的工程管理软件-提供一站式服务

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

使用Softing edgePlug软件扩展数控机床的连接性

那些使用SINUMERIK 840D控制器来运行数控机床的制造商正面临着一个挑战——从车间提取机床性能和过程数据来进行分析。这些数据对于优化流程至关重要&#xff0c;但它们却无法通过传统方式来被获取。对此&#xff0c;制造商的应对方法是通过自定义代码来实现数据访问&#xff0…

BufferedOutputStream,BufferedInputStream是字节流,对象处理流,序列化,输入输出流,转换流

BufferedInputStream字节输入流 意思就是InputStream类及其子类都能以参数的形式放到BufferedInputStream构造器的参数 package com.hspedu.outputstream_;import java.io.*;/*** author 韩顺平* version 1.0* 演示使用BufferedOutputStream 和 BufferedInputStream使用* 使用他…

带你浅谈下Quartz的简单使用

Scheduler 每次执行&#xff0c;都会根据JobDetail创建一个新的Job实例&#xff0c;这样就可以规避并发访问的问题&#xff08;jobDetail的实例也是新的&#xff09; Quzrtz 定时任务默认都是并发执行&#xff0c;不会等待上一次任务执行完毕&#xff0c;只要间隔时间到就会执…

电子台账:生成的数据和图表导出到一个excel表中

目录 1 数据选择 1.1 选择1行数据 1.2 选择1列数据 2 图表设置 3 数据导出 为了便于进行数据分析和数据展示&#xff0c;可以把生成的汇总数据生成图表&#xff0c;然后对图表进行定制修改&#xff0c;最后把数据和图表一起导出到一个excel表中。 程序目前支持两种数据作…