dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>C/C++技术资料>文章内容
使用strcpy的几点心得
来源:CSDN     作者:    
根据《出现频率最高的笔试题》cphj(原作),及众多的网友的观点。本人做了以下总结:
  大多数人都同意以下这个写法:只是个人风格有些不同而已。
  char *strcpy(char* dest, const char* src)
  {
    assert(NULL != dest);
    assert(NULL != src);

    char *tmp = dest;
    while('\0' != (*tmp++=*sr))  //因为*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++ = *sr )
;          ;        /* 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()。


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

 

 

上一篇:MFC的子类化技术   下一篇:文档 视图 框架窗口间的关系和消息传送规律
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言数组排序小结
·Python 与 C++ 程序的简单实例对
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
·C++初学者应该关心的优秀图书一
·利用C语言小程序来解决大问题
·用C语言写PHP扩展的步骤
·用C语言扩展PHP功能
  相关文章
·MFC的子类化技术
·文档 视图 框架窗口间的关系和消
·轻轻松松C to C++ (一)
·Visual C++ 6.0的文档/视结构
·一个Socket传输文件的例子
·调试Release版本应用程序
·DirectDraw 游戏编程基础(3)
·形形色色的自定义消息(上)
·用VC++6.0编写Proxy服务器
·形形色色的自定义消息(下)
·一个简单的SOAP服务应用
·哈夫曼编/译码演示系统的C程序
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763