不调用库函数,实现strcpy函数

toy53 2011-02-03 03:51:44
char * strCpy(char * strDest,const char * strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));//[1]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}
其中为什么还要定义一个char * strDestCopy,里面感觉不起什么作用,我把返回值设为strDest程序一样可以执行,代码如下
char * strCpy(char * strDest,const char * strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));//[1]
// char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDest;
}
求高手指点。
...全文
791 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
fx397993401 2011-02-08
  • 打赏
  • 举报
回复
对指针还没有理解透彻 呵呵 楼主
ytfrdfiw 2011-02-08
  • 打赏
  • 举报
回复
这种使用方法和你的使用场景有关。

如果你的返回值与dst值不要求相同的话,你的函数用起来就很麻烦。你的函数本身并没有问题,只是你的函数在使用时有场景限制。

其实很多东西没有绝对的“对”与“错”。呵呵。
niuchengshi 2011-02-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 toy53 的回复:]

C/C++ code
char * strCpy(char * strDest,const char * strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));//[1]
char * strDestCopy; //这里没有指向strDest
while ((*strDest++=*strSrc++)!='……
[/Quote]

如果这样用就不是摆设了:printf("%s",strCpy(dest,src));
dragonbooker 2011-02-07
  • 打赏
  • 举报
回复
C语言的参数传递是按值传递的。所以才会出现strDest指针改变了,但主程序依然可以正确的打印出字符串。

可能第一句话听过无数遍了,但真正理解很难。
是这样的,C语言中调用函数传递给被调函数的参数,实际上只传给它一份该参数的拷贝。C语言中参数是通过调用栈传递给被调函数的,调用者先把参数的值传递给寄存器(或栈地址),然后被调者再对这份拷贝进行操作,自然而然,对拷贝的操作不会引起调用者参数的变化。

如果传递给被调用者是参数的一个指针,那么被调用者可以对该地址上的值进行操作,该地址上的值发生变化,会导致参数的值变化;但,这个指针不会指向别的地址。
ljsdaya 2011-02-04
  • 打赏
  • 举报
回复
原来传进函数的指针也是不会变的~~~
toy53 2011-02-03
  • 打赏
  • 举报
回复
恩 我明白了。LZ转死牛角尖了,这下LZ明白了,呵呵
Athenacle_ 2011-02-03
  • 打赏
  • 举报
回复
诶。。LZ怎么不开窍呢?。。。

你分别用自己strcpy和库函数里的strcpy运行以下程序,你就会知道哪不一样了。

int main(void)
{
char src[] = "apple";
char dest[10] ;
char *cpy = strcpy(dest,src);
printf("%s",cpy);
return 0;
}



虽说这里的返回值的确是个摆设,没人回去用它,但标准里就是这么要求了的,你的strDestCopy,根本达不到要求。。就是错的。。。

诶。。。LZ怎么这么想不通呢?。。。
toy53 2011-02-03
  • 打赏
  • 举报
回复
char * strCpy(char * strDest,const char * strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));//[1]
char * strDestCopy; //这里没有指向strDest
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}

这样也是可以的,我现在怀疑这里的返回值是不是就是个摆设,感觉根本没起到作用嘛
Athenacle_ 2011-02-03
  • 打赏
  • 举报
回复
对,就算没有strCopy,只用strDest,这个strcpy看起来的确可以起到复制字符串的作用,但是,这个库函数还有另外一个要求,就是返回一个指向复制后的字符串的指针。就是像 strDest == strcat(strDest,strSrc)这个等式永远成立。
如果LZ一旦这么写了:

// char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //改变了strDest指向的位置,在这之后的strDest就不是应该有的那个strDest了。
return strDest;

LZ自己再想想。
toy53 2011-02-03
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
int main(void)
{
char str1[50]="You are ";
char str2[50];
char * strCpy(char * strDest,const char * strSrc);
char * strCat(char * strone,const char * strtwo);
printf("please input your name:");
scanf("%s",&str2);
if (strlen(str2)!=0)
{
strCpy(str1,str2);
printf("%s\n",str1);
}
return 0;
}
char * strCpy(char * strDest,const char * strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));//[1]
// char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDest;
}
ljsdaya 2011-02-03
  • 打赏
  • 举报
回复
lz,是不是你在外面先保存了strDest这个指针呢,你把代码全部贴出来吧哈~
toy53 2011-02-03
  • 打赏
  • 举报
回复
不是啊,我将返回值改成 return strDest; 按理说它最终应该打印不出复制过去的字符串的,但是程序跟原本一样,可以正常执行。就是说效果跟改变之前一样。
AnYidan 2011-02-03
  • 打赏
  • 举报
回复
加一个指针保持原地址,用于返回,返回一个指针用于表达式的“连等形式”可用
「已注销」 2011-02-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 toy53 的回复:]
char * strCpy(char * strDest,const char * strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));//[1]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0')……
[/Quote]

不加 char * strDestCopy=strDest;
返回的就是指向最后一个字符的的指针。
注意这句:*strDest++。

比如: strcpy(p, "abcde"),
最后p指向e
char* strcpy(char* dest, char* src)
{
assert((dest!=NULL)&&(src!=NULL)) ;
int i = 0 ;
while (*dest++ = *src++)
++i ; //计算复制了几个字符。
return dest - ++i;
}


ww884203 2011-02-03
  • 打赏
  • 举报
回复
是的,返回值应该是复制完成后字符串的开始,但是复制的时候已经复制到结尾了,所以必须先保存开头的地址
modaoshi3002 2011-02-03
  • 打赏
  • 举报
回复
char * strDestCopy
此句必须存在!绝对不能删掉!
用于返回新字符串的地址。
因为在代码里,你的新字符串的地址是在不断的改变的(往前移动)
modaoshi3002 2011-02-03
  • 打赏
  • 举报
回复
贴一下一个叫林锐的大鸟的代码
此题8分,分步骤给分。

char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL)); // 2分
char *address = strDest; // 2分
while( (*strDest++ = * strSrc++) != ‘\0’ ) // 2分
NULL ;
return address ; // 2分
}
toy53 2011-02-03
  • 打赏
  • 举报
回复
char * strCpy(char * strDest,const char * strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));//[1]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}

char * strCpy(char * strDest,const char * strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));//[1]
// char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDest;
}
toy53 2011-02-03
  • 打赏
  • 举报
回复
不好意思,第一次用,代码格式贴错了。再贴下
[code=C/C++][/char * strCpy(char * strDest,const char * strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));//[1]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}
]
[code=C/C++][/char * strCpy(char * strDest,const char * strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));//[1]
// char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDest;
}
]

69,373

社区成员

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

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