strcpy函数:顾名思义字符串复制函数:原型:extern char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的为复制后的新值)。要求:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
该图为strcpy英文介绍:
当然也要区别下不同的编译器,可能处理执行有差异。
strcpy函数原型1
char * strcpy(char *a,char *b)
{ while((*(a++)=*(b++))!=0);return a;}
strcpy函数原型2
char *strcpy(char *strDest, const char *strSrc);//strDest为目标,strSrc为源
{
assert((strDest!=NULL) && (strSrc !=NULL)); //如果两个为空则不用复制,直接中止
char *address = strDest; //用address指向strDest开始地址
while( (*strDest++ = * strSrc++) != ‘\0’ ) //复制,直到源串结束;
NULL ; //空操作
return address ; //返回strDest开始地址
}
}//就这个算法看来是多余.
Char* 类型的返回值,可以实现链式表达式。
Exp:int length = strlen(strcpy(strdest,”Hello World”));
strlen函数的意思是测试字符串的字符长度,不含字符串结束标志的。
sizeof是个运算符,它的结果是字符串在内存中的所占字节大小,它要把\0算进去的。
strcpy只是复制字符串,但不限制复制的数量。很容易造成缓冲溢出,也就是说,不过dest有没有足够的空间来容纳src的字符串,它都会把src指向的字符串全部复制到从dest开始的内存,
int _tmain(int argc, _TCHAR* argv[])
{
char *s = "Golden Global View";
char c1[5];
char c2[5];
char c3[5];
memset(c1,0,sizeof(c1));
memset(c2, 0, sizeof(c1));
memset(c3, 0, sizeof(c1));
strcpy(c1, s);
printf("%s", c1);
printf("%c", c2[0]);
printf("%c", c3[0]);
getchar();
return 0;
}
可见,strcpy 同 printf以结束符判断结果。 同时栈溢出,有的编译器的话,溢出导致修改邻居地址存储的数据,导致产生预料不到的问题。
总结,使用strcpy,注重考虑结束符的问题!
标签:dest,char,strcpy,字符串,c1,strDest From: https://blog.51cto.com/u_6958388/5922936