
根据《出现频率最高的笔试题》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[] = "12345670";
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 = "abcd12345670
