strcpy的源码(修改版)质疑

astrotycoon 2010-11-24 02:05:49
大家好,我偶然在ChinaUnix上看到一篇名叫《C 语言中操作字符串的一些函数源代码(修改版)》的文章(http://blog.chinaunix.net/u1/41638/showart_419839.html),其中strcpy函数的内容为:
strcpy(), 字符串拷贝.
char *stpcpy (char *dst, const char *src)
{
while ((*dst++ = *src++) != '\0');
return dst - 1;
}
可是我觉得不对,返回的(dst - 1)好像并不是dst原先的地址了,不知大家怎么看?
...全文
465 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Michael_Xie 2011-07-25
  • 打赏
  • 举报
回复
STPCPY(3) Linux Programmer's Manual STPCPY(3)

NAME
stpcpy - copy a string returning a pointer to its end
hongwenjun 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 anyidan 的回复:]

C/C++ code


/***
*char *strcpy(dst, src) - copy one string over another
*
*Purpose:
* Copies the string src into the spot specified by
* dest; assumes enough room.
*
*Entry:
* cha……
[/Quote]
++
char * mystrcat( char * dst,  const char * src )  
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
/* 实际把这句 while( *cp++ = *src++) 拆开
首先*cp = *src 赋值,然后判断表达式的值while(*cp)
然后自增cp++, src++ 所以,整个表达式的结束判断就在于while(*cp)
如果*cp== '/0 ',因为 '/0 '对应的ascii码就是0,所以判断就为假,也就退出循环了*/
return( dst ); /* return dst */
}
char * mystrcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ ) ; /* Copy src over dst 参考上面mystrcat */
return( dst );
}


STRLEN.C STRNCAT.C STRCMP.C 等看懂了 很有好处
flysnowhite 2011-07-21
  • 打赏
  • 举报
回复
高手如云啊
AnYidan 2011-07-21
  • 打赏
  • 举报
回复


/***
*char *strcpy(dst, src) - copy one string over another
*
*Purpose:
* Copies the string src into the spot specified by
* dest; assumes enough room.
*
*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"
*
*Exceptions:
*******************************************************************************/

char * __cdecl strcpy(char * dst, const char * src)
{
char * cp = dst;

while( *cp++ = *src++ )
; /* Copy src over dst */

return( dst );
}
szqh97 2011-07-20
  • 打赏
  • 举报
回复
呵呵,楼主看仔细一点啊,是stpcpy而不是strcpy啊
sdy330441359 2011-07-20
  • 打赏
  • 举报
回复
我看是正确的
astrotycoon 2010-11-25
  • 打赏
  • 举报
回复
不好意思,我看错了,要仔细了
kangqi7000 2010-11-24
  • 打赏
  • 举报
回复
我看是正确 的阿
nix_fire 2010-11-24
  • 打赏
  • 举报
回复
怀疑的态度是好的,呵呵,不过先看清楚这个函数的用法再说……

stpcpy  

原型:extern char *stpcpy(char *dest,char *src);   
用法:#include <string.h>   
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。   
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
  
返回指向dest结尾处字符(NULL)的指针。
thegreatone 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xhjbeidoulong 的回复:]
请注意, 它是:stpcpy, 不是strcpy

它的目的是想, 返回字符串结尾位置.

不过, 我觉得它叫stpcat更好(它实际应该是想优化strcat), 这样代码就会这样:
char buf[xxx];
char *pDst = buf;
pDst = stpcat(pDst, "aaaa");
pDst = stpcat(pDst, "bbbb");
[/Quote]有道理
xhjbeidoulong 2010-11-24
  • 打赏
  • 举报
回复
请注意, 它是:stpcpy, 不是strcpy

它的目的是想, 返回字符串结尾位置.

不过, 我觉得它叫stpcat更好(它实际应该是想优化strcat), 这样代码就会这样:
char buf[xxx];
char *pDst = buf;
pDst = stpcat(pDst, "aaaa");
pDst = stpcat(pDst, "bbbb");
iblold 2010-11-24
  • 打赏
  • 举报
回复
怀疑的态度是好的,呵呵,不过先看清楚这个函数的用法再说……

stpcpy  

原型:extern char *stpcpy(char *dest,char *src);   
用法:#include <string.h>   
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。   
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
  
返回指向dest结尾处字符(NULL)的指针。
phpjspasp 2010-11-24
  • 打赏
  • 举报
回复
stpcpy 就是这样的。
  • 打赏
  • 举报
回复
楼主,你是对的!
hrx1989 2010-11-24
  • 打赏
  • 举报
回复
返回是错误的吧
前面最好加一个判断....
weinan003 2010-11-24
  • 打赏
  • 举报
回复
他返回的是dst字符串最后一位的地址,写错了,应该按5楼所示,在赋值之前用一个指针保存首地址
luciferisnotsatan 2010-11-24
  • 打赏
  • 举报
回复
写错了吧
sbdt123 2010-11-24
  • 打赏
  • 举报
回复
应该是写错了
ouyh12345 2010-11-24
  • 打赏
  • 举报
回复
应该是错了,看strcat
char *strcat (char *dst, const char *src)
{
char *ret = dst;
while (*dst++ != '\0');
--dst;
while ((*dst++ = *src++) != '\0');
return ret;
}
elated 2010-11-24
  • 打赏
  • 举报
回复
把dst先复制到一个临时变量,然后返回
加载更多回复(3)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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