C语言-strncmp strncat strncpy长度受限制的字符串函数

本文详细介绍了C语言中的strncmp、strncat和strncpy这三个字符串处理函数,重点讲解了它们的语法、参数、功能以及在处理长度受限字符串时的区别和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

strncmp strncat strncpy长度受限制的字符串函数

首先 我们需要知道 这几个的语法格式差不多 

这里传递的size_t的长度是传递的字节长度 不是个数 也就这里int*是四个字节 char*是一个字节 如果是整数进行交换 。此时也就需要20个字节,这样可以交换五个整数

这里差异只是多一个参数 也就是size_t sz长度参数

strncpy(拷贝)

这里只是多一个字节长度

这里拷贝三个

这里是让拷贝几个就拷贝几个 没有’\0‘

这里拷贝8个 这里是不足八个 加上'\0'

strncpy代码的模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
void my_strncpy(char* str1, char* str2, size_t sz)
{
	assert(str1 && str2);
	while (sz > 0)//这里是字节交换 每次sz会进行减少一个字节
	{
		*str1 = *str2;//这里进行复制
		str1++; //各自向后移动
		str2++;
		sz--;//字节每次减少1 
	}
}
int main()
{
	char arr1[] = "dfhguil";
	char arr2[100] = { 0 };
	my_strncpy(arr2, arr1, 3);
	printf("%s", arr2);
	return 0;
}

strncat(拼接)

举例1

这里是追加三个字节

举例2

这里是追加3个 从前往后走进行追加 把该追加的追加之后 会放一个字符串

举例3

把该追加的追加之后 加上字符串0 之后就不继续添加了

strncat的模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
void my_strncat(char* str1, char* str2, size_t sz)
{
	assert(str1 && str2);//这里使用一个断言 也就是只要不是空指针 就可以继续运行

	while (*str1 != '\0')//这里是先找到第一个数组的'\0'然后跳出循环
		str1++;

	while (sz != 0)//其次和之前的循环方式一样 每次减少一个字节 ++ 把数值赋给arr1 但是这里需要知道 这里是常量字符串 所以需要arr1 的空间大于arr2
	{
		*str1 = *str2;
		str1++;
		str2++;
		sz--;
	}
	*str1 = '\0';//最后是把'\0'放到字符串的结尾
}
int main()
{
	char arr1[100] = "hello ";
	char arr2[] = "bitttt";
	my_strncat(arr1, arr2, 3);
	printf("%s", arr1);
	return 0;
}

strncmp(比较)

这里是比较前两个字节  

在给定 的长度范围内进行比较

这里你让我拷贝 我就进行拷贝 存在越界访问的情况

这里拷贝出来 但是程序崩溃了

strncmp的模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcmp(char* str1, char* str2, size_t sz)
{
	assert(str1 && str2);

	while (*str1 == *str2)//这里代码循环的条件就是只要相等就继续++ 然后遇见最后一个字符'\0'自然会跳出循环
	{
		if (sz == 0)//这里每次循环的时候会进行sz的-- 也就是对照字符的-- 如果不满足相等的条件 此时也就会跳出循环
		{
			return 0;
		}
		str1++; str2++;
		sz--;
	}
	return *str1 - *str2;

	//while (*str1 == *str2 && sz > 0)
	//{

	//	str1++; 
	//	str2++;
	//	sz--;
	//}
	//return sz == 0 ? 0:(*str1 - *str2);//这里是使用一个三目操作符 如果满足sz循环 也就是返回0  不然就是返回差值 这样也是允许的

}

int main()
{
	char arr1[100] = "hello ";
	char arr2[] = "bitttt";
	int ret = my_strcmp(arr1, arr2, 3);
	printf("%d", ret);
	return 0;
}

 

代码使用的总结

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
int main()
{
	//拼接限制函数的使用  这里拼接三个
	char arr1[100] = "slaidg ";
	char arr2[] = "dfilsug ";
	strncat(arr1, arr2, 3);
	printf("%s\n\n", arr1);

	//拷贝限制函数的使用 这里拷贝五个
	char arr3[] = "slaidg ";
	char arr4[100] = { 0 };
	strncat(arr4, arr3, 5);
	printf("%s\n\n", arr4);


	//比较函数的使用
	char arr5[] = "slaidg ";
	char arr6[] = "dfilsug ";
	char arr7[] = "slaidg ";
	int ret1 = strcmp(arr5, arr6, 3);//不相同 1   前三位比较的时候上面的大 arr5大
	int ret2 = strcmp(arr5, arr7, 3);//相同   0   前三位一样大
	printf("%d\n%d\n", ret1, ret2);
}

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值