strcpy自写的疑问?

铭毅天下
大数据领域优质创作者
博客专家认证
2012-08-22 09:04:53

提问:在字符串拷贝函数中,通用简洁格式如下:while((*strDest++ = *strSrc++) != '\0');
个人认为它与如下的写法等价。
while(*strSrc != '\0')
{
*strDest = *strSrc;
strSrc++;
strDest++;
}
我的疑问是在:while((*strDest++ = *strSrc++) != '\0')中,'!='号如何解读?
个人理解:应该是把源字符串一位*strsrc赋值给目标字符串的一位*strDest,然后源字符串地址+1,目标字符串地址+1,而后判断的是strSrc所指的单元非空(!='\0')吗?
疑惑点:(*strDest++ = *strSrc++) != '\0',应该是*strSrc!='\0',而不是*strDest!='\0'吧?
但是(*strDest++ = *strSrc++)后给人的感觉是判断的*strDest!='\0'.
求详解,谢谢!
...全文
118 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingxuke 2012-08-22
  • 打赏
  • 举报
回复
strcpy 会将字符串结束符 '\0' 拷贝到目标字符串,所以
while((*strDest++ = *strSrc++) != '\0');

while(*strSrc != '\0')
{
*strDest = *strSrc;
strSrc++;
strDest++;
}
并不等价。第一种写法将 '\0' 拷贝到目标字符串来作 != '\0' 的判断,而你写的不能把 '\0' 拷贝到目标字符串。

--{个人理解:应该是把源字符串一位*strsrc赋值给目标字符串的一位*strDest,然后源字符串地址+1,目标字符串地址+1,而后判断的是strSrc所指的单元非空(!='\0')吗?}

最后一句不对:而后判断的是 strDest 所指的单元非空(!='\0')!

另外:既然是拷贝,两个最终都一样,谁比结束符都一样么。

楼主再理解下吧,Good Luck!
翅膀又硬了 2012-08-22
  • 打赏
  • 举报
回复
就是在判断*strDest!='\0'。看下面的
if ((b = a)!=0)
00411545 mov eax,dword ptr [a]
00411548 mov dword ptr [b],eax
0041154B cmp dword ptr [b],0
0041154F je main+3Ah (41155Ah)

你也可以自己在那设置断点,然后进入断点,按ctrl+f11。虽然不怎么会汇编,但是能看个大概
c++面试题53个问题 1.C++的三大特性 2.C和C++的区别 3.全局变量和局部变量在内存分配上有何不同 4.static的作用 5.const解释其作用 6.指针和引用的区别 7.智能指针 8.简述深拷贝和浅拷贝的区别 9.编写my_strcpy函数,实现与库函数strcpy类似的功能,不能使用任何库函数 10.请讲述堆和栈的区别 11.全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的 12.new、delete、malloc、free之间的关系 13. 头文件种的ifndef/define/endif 是干什么用的 14.TCP和UDP有什么区别 15.STL库用过吗?常见的STL容器有哪些?算法用过哪几个 16.同步IO和异步IO的区别 17.说下你对内存的了解 18.C++文件编译与执行的四个阶段 19.extern关键字的作用 20.#define和const的区别 21.结构体struct和共同体union(联合)的区别 22.C++中vector和list的区别 23.结构体和类的区别 24.STL中map和set的原理(关联式容器) 25.MFC的消息机制 26.消息映射 27.列举几种进程的同步机制,并比较其优缺点 28.数组和链表的区别 29.MFC主要要用到哪几个类?及其各个类的作用 30.MFC六大核心机制 31.OnDraw和OnPaint 32.win32程序的消息响应机制是如何实现的 33.MFC中的消息响应机制是如何实现的 34.WM_COMMAND命令消息处理顺序 35.MFC序列化的概念 36.PeekMessage和GetMessage的主要区别 37.WIN32创建窗口程序基本函数 38.Windows中的系统消息循环占用CPU的疑问 39.队列消息与非队列消息 40.GDI对象绘图步骤 41.设备上下文DC 42.GDI位图绘制步骤 43.当模态对话框点开后,主窗口还能响应处理消息吗 44.MFC的消息分类 45.CListCtrl 虚拟列表技术 46.虚函数是怎么实现的 47.什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法? 48.变量的声明和定义有什么区别 49.sizeof是一个操作符,strlen是库函数 50.写一个“标准”宏MIN 51.简述strcpy sprintf与mencpy的区别 52.链表与数组的区别 53.简述队列和栈的异同

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧