对strcat函数的理解

函数原型:extern char *strcat(char *dest,char *src);

#include <string.h>
在C++中,则存在于<cstring>头文件中。
把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
问题延伸:在下面的测试代码中用字符串的行式声明并初始化s与t会出现内存不能读写的错误:即把数组形式的char s[] = "chen xun";改写成指针形式char *p= “chen xun ”;再调用函数。
这个问题怎么理解呢:用指针形式声明的字符串常量是存在常量区,通过p修改是未定义的行为,因为p是指向常量的字符串。常量字符串的内容是不可以被修改的,企图修改常量字符串的内容而导致运行错误。
再看c专家编程上的讲解
定义指针时,编译器并不为指针所指的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋给指针
一个字符串常量进行初始化。例如,下面的定义创建一个字符串常量(为其分配内存):
char *p = “breadfruit”;
注意只有对字符串常量才是如此。不能指望为浮点数之类的变量分配空间,如:
float *pip = 3.14;     /* 错误,无法通过编译*/
在ANSI C 中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串值,程序会
出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
 
数组也可以用字符串常量进行初始化:
char a[] = “gooseberry”;
与指针相反,由字符串常量初始化的数组是可以修改的。比如下面的语句:
strncpy( a, “black”, 5 );
将数组的值修改为“blackberry”。
 
 
#include <string>
#include <assert.h>

#ifndef NULL  
#define NULL ((void *)0)  
#endif

void myStrcat1(char s[], char t[]);
char *myStrcat2(char *strDest, char *strSrc );
//void myStrcat3(string strDest, string strSrc);

int main()
{
	char s[50] = "chen xun ";
	char t[20] = "is a good student.";
	s[0] = 'w';
// 	myStrcat1(s,t);
// 	cout<< s <<endl;

	
	 myStrcat2(s, t);
	cout<<s<<endl;
	return 0;


}


/*
	The c programming中的一种实现方法
	strcat:  concatenate t to end of s; s must be big enough 
*/

void myStrcat1(char s[], char t[])
{
	int i, j;
	i = j = 0;
	while (s[i] != '\0') /* find end of s */
		i++;
	while ((s[i++] = t[j++]) != '\0') /* copy t */
		;
}

char *myStrcat2( char *strDest,  char *strSrc )
{
	assert(strSrc != NULL && strDest != NULL);
	char *ptemp =strDest;      
	for(;*strDest; ++strDest);      
	while((*strDest++ = *strSrc++) != '\0');      
	return ptemp;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值