清问哪位大侠帮我写一下void strcpy(char *strDest,char *strSrc)的原代码,不调用C++/C的标准函数

szwindows 2003-03-20 05:16:03
谢谢了
...全文
84 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wingfiring 2003-03-21
  • 打赏
  • 举报
回复
楼上的,别忘记了,接口是楼主定义的,你没有权利更改接口,即使他不堪入目.
对于saili100()的代码,1.它遵守了接口要求.2.它实现了要求的功能3.代码清晰明了,任何一个合格的C程序员都不会对这段代码产生迷惑.
对于效率问题,并不是楼主要求的.我也没说过saili100()的代码好是因为他短.事实上和其他几个代码肯定效率不会比saili100()的更高,最多一样.
'\0'无论在什么机器上,无论什么字符集,都必须是0.因为\0就表示这个char的值是0.
还要指出的一点是,你猜想"绝大部分库函数也会是这么写的",恰恰相反,我见到的实现版本都不是你想像的那样.我见过的版本包括linux和一些unix的实现。对于linux,我想你可以很方便的查证。遗憾的是,没见过ms的版本。
zhouzhaohan 2003-03-21
  • 打赏
  • 举报
回复
saili100() :
我觉得这种程序不能称作简单明了,因为它除了打印的时候省纸,存成文件省空间以外看不出任何好处。:)
有返回值是为了连续调用函数方便,比如strcat(strcpy(dest,src),str1);
作为判断语句,如果一个变量当作类似于布尔型使用,比如IsOpen,则用if(IsOpen)比较好,如果只是一个数值,则应该写作if(num==0)之类的。而且代码写的短,并不代表实际的运行效率就会高,比如if(num)和if(num!=0)和可能最终生成的代码就是一样的。更何况'\0'和0其实并没有什么必然的联系,虽然他们可能实际上在内存中表示是一样的。
我承认我写的代码不安全,但我不觉得如果判断了是否传进空指针就安全多少,如果两块地址有overlapping的话,同样会不安全,这个和memcpy是类似的。函数不可能十全十美,但是至少要向用户进行说明,有些问题不应该函数来考虑,而应该让用户自己去保证,当然一个设计的好的函数是应该引导用户不会犯错误的,但是并不是说一个函数就应该做得非常的完美,否则效率就太低,而且很可能做不到。我和bm1408(VC一线)贴的函数是一样的,而且我想绝大部分库函数也会是这么写的。
个人观点,仅供参考。
wingfiring 2003-03-21
  • 打赏
  • 举报
回复
to boolean6199(破布):
对不起,泄露了国家机密,饶了我吧.^_^
zhouzhaohan 2003-03-21
  • 打赏
  • 举报
回复
to wingfiring(wingfire):
>楼上的,别忘记了,接口是楼主定义的,你没有权利更改接口,即使他不堪入目.
一个小的建议,以后最好不要用楼上的这类相对地址的称谓,而改成绝对地址,很多时候我都发现,我打开网页的时候的楼上已经不是我发贴子时的楼上了,不免会殃及池鱼的。:p我承认我的接口和楼主定义的不一样,也很希望楼主说明到底是希望那个函数还是库函数,要知道这里的很多人问问题都是不是很明确,所以我也习惯了猜(所以我猜了后者),以后我会注意。
>对于saili100()的代码,1.它遵守了接口要求.2.它实现了要求的功能3.代码清晰明了,任何一个合格的C程序员都不会对这段代码产生迷惑。如我所说,那个判断语句不是一种好的风格。
>对于效率问题,并不是楼主要求的.我也没说过saili100()的代码好是因为他短.事实上和其他几个代码肯定效率不会比saili100()的更高,最多一样.
我也没有只是嵌掉你的代码短,而是和我贴出来的代码相比,并没有什么优势,也许还差一点(不过我承认那段代码是我拷贝的,不是我自己写的,虽然我自己写也会是那个样子)。至于效率问题,我只是泛泛而谈,并没有就事论事。
>'\0'无论在什么机器上,无论什么字符集,都必须是0.因为\0就表示这个char的值是0.其实我没有否认这点,c的标准里也是这么写的,但是这两者是不是必然相等,有待商榷,毕竟如果当初把它定义成0xff也无不可。就像如果我判断它是不是等于NULL也可以,可是那样做并不make sense.
>还要指出的一点是,你猜想"绝大部分库函数也会是这么写的",恰恰相反,我见到的实现版本都不是你想像的那样.我见过的版本包括linux和一些unix的实现。对于linux,我想你可以很方便的查证。遗憾的是,没见过ms的版本。
这种话确实是不应该说的,只是那段代码我见过实在太多次了。linux的源代码(事实上这并不是标准的库函数)我看了一下,好像也是那么写的,不知道你看的是什么版本?另外,我觉得我有点概念上的错误,就是我看的函数好像并不是标准库函数的代码,请问在什么地方可以看到标准库函数的代码?是不是应该看gcc的库函数的源代码才是。
欢迎批评指正!
Cybergate 2003-03-21
  • 打赏
  • 举报
回复
是的,为了调试阶段减少bug可以考虑加上ASSERT,但是这样做意义不大。

1、ASSERT可以避免少数错误,例如传空指针,但是传空指针的概率毕竟很低,发生错误90%以上传入的是悬挂指针!!!
2、对于空指针和悬挂指针的判断来说,大部分调试器(例如VC)往往已经给你代劳了,这样做没有太多意义。
3、C语言在最初的设计中,最重视的是效率。从原则上来说,保证安全、检查错误的责任在于程序员,而不是编译器和程序库!你加入这些判断,实际上是违背了原则。
4、至于Release版本,要不要判断,我想不用说了。
bm1408 2003-03-20
  • 打赏
  • 举报
回复
char * strcpy(char * dest,const char *src)
{
char *temp = dest;

while ((*dest++ = *src++) != '\0')
/* nothing */;
return tmp;
}
boolean6199 2003-03-20
  • 打赏
  • 举报
回复
MSDN上说c/c++标准库的strcpy也没保证安全,可能会出现strDest越界.

To wingfiring:干嘛提到我的名字?
wingfiring 2003-03-20
  • 打赏
  • 举报
回复
要我说saili100()的最好。
安全?那就加两条assert好了。调试的时候有用。
如果还有程序员不满意,建议他的老板把他开掉:加了检查就安全了吗?不过多了掩盖罪恶的破布而已。
saili100 2003-03-20
  • 打赏
  • 举报
回复
void strcpy(char *strDest,char *strSrc)
{
while(*strDest++=*strSrc++);
}


当复制到/0时,因为*strDest=/0(即NULL),循环条件为假,结束循环。简单明了。
hawkeyes_yq 2003-03-20
  • 打赏
  • 举报
回复
char * strCopy(char * strDest, const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL))
throw ("argument is not right!");

char * strDestCopy = strDest;

while (*(strDest++)=*(strSrc++)!='\0');

return strDestCopy;
}

这样应该是可以的
cxjddd 2003-03-20
  • 打赏
  • 举报
回复
楼上几位写的都不安全啊!
caowy 2003-03-20
  • 打赏
  • 举报
回复
void strcpy(char * dest,const char * src)
{

char *tmp=dest;

while((*tmp++ = *src++) != NULL)
;
}

这样可以了吗?其实它是一个地址参量,指针dest指的内容与src同

zhouzhaohan 2003-03-20
  • 打赏
  • 举报
回复
char * strcpy(char * dest,const char *src)
{
char *tmp = dest;

while ((*dest++ = *src++) != '\0')
/* nothing */;
return tmp;
}
你要求的返回值有问题。

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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