分享
 
 
 

使用strcpy的几点心得

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

根据《出现频率最高的笔试题》cphj(原作),及众多的网友的观点。本人做了以下总结:

大多数人都同意以下这个写法:只是个人风格有些不同而已。

char *strcpy(char* dest, const char* src)

{

assert(NULL != dest);

assert(NULL != src);

char *tmp = dest;

while('\0' != (*tmp++=*src++)) //因为*tmp不是布尔值所以有必要比较

;

return(dest);

}

而根据MS中的定义如下:

(%VC%/vc7/crt/src/intel/strcat.asm)

page

;***

;char *strcpy(dst, src) - copy one string over another

;

;Purpose:

; Copies the string src into the spot specified by

; dest; assumes enough room.

;

; Algorithm:

; char * strcpy (char * dst, char * src)

; {

; char * cp = dst;

;

; while( *cp++ = *src++ )

; ; /* Copy src over dst */

; return( dst );

; }

;

;Entry:

; char * dst - string over which "src" is to be copied

; const char * src - string to be copied over "dst"

;

;Exit:

; The address of "dst" in EAX

;

;Uses:

; EAX, ECX

;

;Exceptions:

;**********************************************************************

1.没有检查输入的两个指针是否有效。

2.没有检查两个字符串是否以NULL结尾。

3.没有检查目标指针的空间是否大于等于原字符串的空间。

所以这些条件都需要调用者去完成。

看下面程序:

//拷贝字符串"abcd"

int nLen_Src = 0;

int nLen_Dest = 0;

char szTemp[] = "1234567890";

char szSrc[] = {'a', 'b', 'c', 'd'}; //正确的用法是在加个'\0'

char szDest[2]; //char szDest[5] = {0};栈中分配空间的最小 //边界是4字节,所以szDest数组的大小为1、2、

//3、4下面的结果都是一样的。

nLen_Src = strlen(szSrc);

nLen_Dest = strlen(szDest);

strcpy(szDest, szSrc);

结果是:nLen_Src = 14, nLen_Dest = 18;

szDest = "abcd1234567890", szSrc = "1234567890";

szTemp = "567890";

数组指针越界导致堆栈中其他变量内容被改变。所以在使用strcpy时要注意以下几点:

1。用数组在栈中分配的字符串空间时,其大小必须比要装入的字符串长 度多一个,以存储结尾的NULL字符(用{0}和'\0'表示),并且要马上 初始化。

2。目标字符串的空间必须大于等于原字符串的空间,否则建议使用 strncpy()或WINAPI的lpstrcpyn()

3。注意在使用LPSTR lstrcpyn(LPTSTR lpString1, LPCTSTR lpString2, int iMaxLength)时,其中的iMaxLength是要拷贝的字符 串长度加1,因为它自动将lpString1的最后一个字符设定为NULL。这 就避免了字符串指针越界了。

4。使用new分配的空间也要及时的初始化。使用memset()或 ZeroMemory()。

--------相关资料可以参考<<高质量C++编程指南>>(林锐博士)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有