原型:
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后,指向字符串结束符的后一个字节,是不对的。