strcat和strncat的区别以及使用

原型:

char *strcat(char *dest, const char *src);

char *strncat(char *dest, const char *src, size_t n);
参数:

dest:目标字符串的内存空间

src:源字符串

n:指定src的前n个字符赋值

功能:

strcat:将src在dest后延续,将覆盖dest的字符串结束符'\0',并在最后重新添加一个'\0'

strcat:和strcat类似,不过可以指定前n个字符赋值。他们总能保证dest以'\0'结束。

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


void test(void);
char *my_strcat(char *dest, const char *src);
char *my_strncat(char *dest, const char *src, size_t n);

int main(void)
{
	test();
	
	return 1;
}

void test(void)
{
	char dest[20] = "hello";
	char src[ ] = " world";
		
	//my_strcat(dest, src);
	my_strncat(dest, src, -1);
	printf("%s\r\n", dest);
}
//自己实现的strcat
char *my_strcat(char *dest, const char *src)
{
	char *p_dest = dest;
	const char *p_src = src;
	if(NULL == dest || NULL == src)
	{
		return NULL;
	}
	//1.指针到达dest结束符
	while(*p_dest != '\0')
	{
		p_dest++;
	}
	//2.赋值src到dest,结束条件:*src=='\0'
	while((*p_dest++ = *p_src++) != '\0')
	{
		
	}
	return dest;
}

//自己实现的strncat
char *my_strncat(char *dest, const char *src, size_t n)
{
	char *p_dest = dest;
	const char *p_src = src;
	if(NULL == dest || NULL == src)
	{
		return NULL;
	}

	//到达dest末尾
	while(*p_dest != '\0')
	{
		p_dest++;
	}
	//赋值src到dest,结束条件:n=0或者*p_src=='\0'
	while((n--) && ((*p_dest++ = *p_src++) != '\0'))
	{
		;
	}
}












实验1.故意将dest内存改小

当dest内存不足时,也有可能可以运行,但是结果是不可预期的,需要特别注意,避免内存溢出。

实验2.故意将n改的很大

当n大于src长度的时候,赋值会有判断条件*src == '\0'结束,所以n是安全的,至少不会导致内

存溢出。

实验3.故意将n变为负数

当n为负数时,它被解释为无符号整数。这是因为size_t为无符号整数,它的大小和平台有关,当前占用字节为4字节。

总结:

1.dest的内存必须足够,不然会导致内存溢出,结果不可预知

2.size_t是无符号整形数

3.实现过程中需要将dest先到达字符串尾部曾经有两种写法:

//第一种
//1.指针到达dest结束符
while(*p_dest != '\0')
{
    p_dest++;
}
//第二种
//1.指针到达dest结束符
while(*p_dest++ != '\0')
{
    ;
}

第一种是正确的,退出while后,指向字符串结束符。第二种看似简约,退出while后,指向字符串结束符的后一个字节,是不对的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值