Chinaunix首页 | 论坛 | 博客
  • 博客访问: 532149
  • 博文数量: 129
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1888
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-20 11:09
文章分类

全部博文(129)

文章存档

2016年(1)

2015年(5)

2014年(64)

2013年(59)

我的朋友

分类: C/C++

2013-07-07 17:21:02

实现库函数strcpy
 
  1. #include<iostream>
  2. #include<assert.h>
  3. using namespace std;
  4. char*strcpy1(char*strDest,const char*strSrc)
  5. {
  6.     assert((strDest!=NULL) && (strSrc!=NULL));
  7.     char*address=strDest;
  8. [1]  while((*strDest++=*strSrc++)!='\0')
  9.     {
  10. [2]    cout<<"1"<<endl;
  11.     }
  12. [3] cout<<*strDest<
  13. [4] return address;
  14. }

  15. int main()
  16. {
  17.     char *src="ab";
  18.     char dest[10];
  19.     char *address=NULL;
  20.     address=strcpy1(dest,src);
  21.     cout<<*address<<endl;
  22.     return 0;

  23. }
对玫红色部分进行解析:(以下都是在VC++6.0下调试的结果)

起始状态:在执行[1]前,strDest:ox003b2f20 ,strSrc: ox00430290,*strSrc='a',*strDest中没有值
while 执行第1次:在执行完[1],跳到[2]后,*strDest='a',然后比较*strSrc是否等于'\0',不管等不等于'\0',strDest和strSrc都执行++。即while执行完后,strDest=ox003b2f21,strSrc=ox00430291。即此时*strDest中没有值,*strSrc的值为'b'。

while 执行第2次:在执行完[1],跳到[2]后,*strDest='b',然后比较*strSrc是否等于'\0',不管等不等于'\0',strDest和strSrc都执行++。即while执行完后,strDest=ox003b2f22,strSrc=ox00430292。即此时*strDest中没有值,*strSrc的值为'\0'。

while 执行第3次:在执行完[1],跳到[2]后,*strDest='\0',然后比较*strSrc是否等于'\0',不管等不等于'\0',strDest和strSrc都执行++。即while执行完后,strDest=ox003b2f23,strSrc=ox00430293。即此时*strDest中没有值,*strSrc的值为'0'。

总结:该while循环条件的执行过程是:先赋值,再比较是不是等于'\0',最后执行++。

阅读(3143) | 评论(8) | 转发(2) |
给主人留下些什么吧!~~

Love_for_Live2013-09-04 22:32:22

assert();这个宏是用来错误检测的。(  #include <assert.h>   原型:void assert(int exp) )
如果表达式的结果为零,该宏将会写错误信息 STDERR 并退出程序执行。
小小的添加一些:
如果 NDEBUG 已经定义,宏 assert()将会被忽略

home_boy2013-07-23 08:33:14

assert((strDest!=NULL) && (strSrc!=NULL));的 && 为什么不是||呢?