首页 > 技术文章 > strcat的用法

ymd12103410 2018-11-21 14:22 原文

原型:

char *strcat(char *str1,char *str2);

strcat的实现:


char* MyStrcat(char *dst, const char*src)
{
	if ((dst == NULL) || (src == NULL))   //先判断指针是否为空,尽量用NULL,0有时候打错不容易发现
		return NULL;
	else
	{
		char* temp = dst;       //把地址赋给临时值,之后用临时值去增加
		while (*temp!='\0')
		{
			++temp;         //把临时值的指针移动到目的代码的结尾处
		}
		while ((*temp++ = *src++) != '\0');   //开始在目的处后连接
		return dst;       //返回原始指针,方便链式连接
	}
}

把两个字符串连接合并成一个字符串,也就是把字符串str2连接到字符串str1后面,连接后的结果放在字符串str1中。

注意:str1指向的内存空间要足够容纳字符串str2.

返回值为指向str1的指针。

int _tmain(int argc, _TCHAR* argv[])
{
	char p1[12] = "apple"; //##p2指向的是只读数据段,strcat是要写数据。往只读数据段写,当然会有异常,p1指向的是栈数据段,可写,所以能通过##
	char *p2 = "banana";  //p2是一个指向字符串的指针,编译器根据初始化此指针时给出的值生成一个字符串,然后把这个字符串的第一个字符的地址拿出来,让p2指向它,其中的数值在只读区,不能改变
	strcat_s(p1, p2);
	printf("%s\n", p1);
   
      char p3[]="aaaaaa";
      //strcpy(p2,p3);  有的博客说是定长,所以不能改变,这边采用相同长度去替换,也失败,主要原因就是上面说的,P2指的是只读区,里面的数据是不能改变的
	strcat_s(p1,p3);  //和strcat的区别只是保证安全性
        printf("%s\n",p1);  //这里就能正常输出了,栈数据段,可读可写
	return 0;
}

总结一下:要连接字符时,要考虑连接后的字符长度是否能在目标空间中放下,另外一点就是,要看数据是否是可写的,指针指向只读区时也是不可行的,数组存放值后,编译器只是把数组的第一个字符地址给指针

推荐阅读