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

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.kler.cn/a/307832.html

相关文章:

  • ubuntu22.04 安装FFmpeg,并进行视频的转化格式和裁剪
  • Vue的基础使用
  • 基于STM32设计的森林火灾监测系统(华为云IOT)_263
  • 【深度学习】学习率介绍(torch.optim.lr_scheduler学习率调度策略介绍)
  • kubernetes简单入门实战
  • 鸿蒙之多选框(Checkbox)
  • ip映射域名,一般用于mysql和redis的固定映射,方便快捷打包
  • python基本数据类型简记
  • vue3 组合式API defineEmits() 与 emits 组件选项
  • I²C通信协议
  • 基于SpringBoot的考研助手系统+LW参考示例
  • 模拟实现通用型排序
  • Rust练手项目,写个有趣的小工具定时从一言网获取一段有趣的话并推送通知
  • STM32—I2C
  • OpenAI o1真的那么强吗
  • 天地一体化物联网:挑战与机遇
  • 移动订货小程序哪个好 批发订货系统源码哪个好
  • 【Elasticsearch系列八】高阶使用
  • 您的计算机已被.lcrypt勒索病毒感染?恢复您的数据的方法在这里!
  • 春秋云境靶场之CVE-2022-29464
  • element-plus弹窗内分页表格保留勾选项
  • 大数据-134 - ClickHouse 集群三节点 安装配置启动
  • 【2023年】云计算金砖牛刀小试4
  • 机器学习文献|基于循环细胞因子特征,通过机器学习算法预测NSCLC免疫治疗结局
  • 24.9.16数据结构|平衡二叉树
  • 如何切换淘宝最新镜像源npm