C语言strncpy的使用缺陷和实现,strncat的使用缺陷和实现,strncmp的使用和实现。

1.strncpy

函数原型:

char *strncpy( char *strDest, const char *strSource, size_t count );
  • char *strDest 目标字符串首元素地址
  • const char *strSource 源字符串(需要拷贝过去的字符串)
  • size_t count 拷贝字符的个数
  • char *strncpy 拷贝结束后,返回目标字符串的起始地址,方便函数的链式访问

函数作用:
拷贝 count 个字符从源字符串到目标空间。如果源字符串的长度小于 count,则拷贝完源字符串之后,在目标后边追加 '\0',直到 count 个。

函数的使用

#include <stdio.h>
#include <string.h>

int main() {

	char str1[] = "abcdfxxxxxxx";
	char str2[] = "qwe";
	printf("%s", strncpy(str1, str2, 3));

	return 0;
}

函数的注意事项:
1.strncpy 拷贝的时候指定的 count 小于源字符串的长度时,strncpy 是不会拷贝 '\0' 的。
2.如果源字符串的长度小于 count,则拷贝完源字符串之后,在目标后边追加 '\0',直到count个。
3.strncpy 相对于 strcpy 函数相对安全,但如果目标字符串的空间没有比源字符串空间大,还是会造成程序异常崩溃。

函数的模拟实现:

#include <assert.h>

char* _strncpy(
	char* dest,
	const char* src,
	size_t count
) {
	assert(dest != NULL && src != NULL);

	char* temp = dest;

	while (count) {
		if (*src) {
			*dest++ = *src++;
		}
		else {
			*dest++ = '\0';
		}
		count--;
	}

	return temp;
}

2.strncat

函数原型:

char *strncat( char *strDest, const char *strSource, size_t count );
  • char *strDest 目标字符串首元素地址
  • const char *strSource 源字符串(需要追加过去的字符串)
  • size_t count 追加字符的个数
  • char *strncat 追加结束后,返回目标字符串的起始地址,方便函数的链式访问

函数作用:
追加 count 个字符从目标字符串'\0'的位置开始追加。如果count小于源字符串的长度,那么追加结束后会主动添加'\0'。如果count大于源字符串的长度,则strncat等价于strcat

函数的使用

#include <stdio.h>
#include <string.h>

int main() {
	char str1[20] = "hello\0##########";
	char str2[] = "qwe";
	printf("%s", strncat(str1, str2 , 6)); // count大于str2的长度,所以这里strncat等价于strcat

	return 0;
}

在这里插入图片描述


#include <stdio.h>
#include <string.h>

int main() {

	char str1[20] = "hello\0##########";
	char str2[] = "qwe";
	printf("%s", strncat(str1, str2, 2)); // count小于字符串长度,追加过去之后会添加'\0'

	return 0;
}

在这里插入图片描述

函数的注意事项:
1.如果count小于源字符串的长度,那么追加结束后会主动添加'\0'
2.如果count大于源字符串的长度,则strncat等价于strcat
3.strncat 相对于 strcat 函数相对安全,但如果目标字符串的空间没有比源字符串空间大,还是会造成程序异常崩溃。
4.目标字符串中要有'\0',因为strncat是从目标字符串'\0'的位置开始追加。
5.源字符串中也有'\0',当count大于源字符串的长度,strncat 会把源字符串全部追加过去,没有'\0'的话,会造成越界访问。
6.strncat可以自己追加自己。

函数的模拟实现

#include <assert.h>

char* _strncat(
	char* dest,
	const char* src,
	size_t count
) {
	assert(dest != NULL && src != NULL);

	char* temp = dest;

	while (*dest) {
		dest++;
	}

	while ((count--) && (*src) && (*dest++ = *src++));

	*dest = '\0';

	return temp;
}

3.strncmp

函数原型:

int strncmp( const char *string1, const char *string2, size_t count );
  • const char *string1 是第一个字符串的起始地址
  • const char *string2 是第二个字符串的起始地址
  • size_t count 比较的个数
  • int strncmp 返回一个整型
    • > 0 说明第一个字符串大于第二个字符串
    • < 0 说明第一个字符串小于第二个字符串
    • = 0 说明两个字符串相等

函数作用: 判断两个字符串在count的范围是否相等。

函数的模拟实现

int _strncmp(
	const char* string1,
	const char* string2,
	size_t count
) {
	assert(string1 && string2);
	while ( (count) && (*string1 == *string2) && (*string1) && (*string2)) {
		string1++;
		string2++;
		count--;
	}
	
	return (count ? *string1 - *string2 : *(string1 - 1) - *(string2 - 1));
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值