社区
工具平台和程序库
帖子详情
清问哪位大侠帮我写一下void strcpy(char *strDest,char *strSrc)的原代码,不调用C++/C的标准函数
szwindows
2003-03-20 05:16:03
谢谢了
...全文
84
13
打赏
收藏
清问哪位大侠帮我写一下void strcpy(char *strDest,char *strSrc)的原代码,不调用C++/C的标准函数
谢谢了
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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;
}
你要求的返回值有问题。
《C语言基础》 之 第9章 字符串
课程内容:字符数组1、字符串越位的问题、指针变量的空间大小、字符串常量、字符串传参、printf格式化输出字符串、字符串的非格式化输出
函数
、字符串输入
函数
、
str
len
函数
、
str
cpy
函数
和
str
ncpy
函数
、
str
cmp
函数
和...
c/
c++
笔试面试题(2)
int
Str
cmp(
char
*
str
1,
char
*
str
2){ int i=0; int b=0; while(
str
1[i]||
str
2[i]) { if(
str
1[i]>
str
2[i]) { b=1;break; } else if(
str
1[i] { b=-1;break; }
常见C/
C++
笔试题目整理(含答案)2
网上流传的一份常见
C++
笔试题目汇总,供各位有找工作需要的同学参考之用,因为
原
文较长,遂采用连载形式,有耐心的同学就请一直跟下去吧,相信一定会有所收获。提前说明一点,题目来在网络,答案是网上资料配的仅供参考,已经有许多
大侠
发现了其中的问题,如有同学觉得哪道题目有异议,欢迎讨论
(转载)c/
c++
笔试面试题(2)
c/
c++
笔试面试题(2) 2007-11-08 16:43464人阅读评论(0)收藏举报 int
Str
cmp(
char
*
str
1,
char
*
str
2){ int i=0; int b=0; while(
str
1[i]||
str
2[i]) { if(
str
1[i]>
str
2[i]) { b=1;break...
工具平台和程序库
24,855
社区成员
27,343
社区内容
发帖
与我相关
我的任务
工具平台和程序库
C/C++ 工具平台和程序库
复制链接
扫一扫
分享
社区描述
C/C++ 工具平台和程序库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章