社区
工具平台和程序库
帖子详情
清问哪位大侠帮我写一下void strcpy(char *strDest,char *strSrc)的原代码,不调用C++/C的标准函数
szwindows
2003-03-20 05:16:03
谢谢了
...全文
125
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;
}
你要求的返回值有问题。
重
写
str
cpy
函数
char
*
Str
Cpy
(
char
*
str
Des
t, const
char
*
str
Src
)
本文介绍了一个用C语言实现的简单字符串复制
函数
Str
Cpy
。该
函数
通过逐个字符复制的方式将源字符串复制到目标字符串,并进行了基本的错误检查。文章还提供了一个简单的测试示例来展示如何使用该
函数
。
面试题:
char
*
str
cpy
(
char
*
str
Des
t,const
char
*
str
Src
);
本文详细解析了如何手动实现
str
cpy
函数
,包括正确的实现方式及常见错误示范。文章通过具体示例
代码
展示了良好的编程习惯和避免潜在错误的方法。
str
cpy
源码:注解
char
*
str
cpy
(
char
*
str
Des
t, const
char
*
str
Src
)
这篇博客讨论了如何不依赖库
函数
实现
str
cpy
,强调了指针有效性检查、异常处理和边界条件的重要性。作者指出,正确的
str
cpy
实现应当检查指针是否为空,避免类型隐式转换,并确保在复制字符串时添加终止符'
编
写
str
cpy
函数
已知
str
cpy
函数
的
原
型是
char
*
str
cpy
(
char
*
str
des
t, const
char
*
str
src
);其中
str
des
t是目的字符串,
str
src
是源字符串
本文详细解析了如何不使用C/
C++
的字符串库
函数
,手
写
一个
str
cpy
函数
。通过
代码
示例,解释了
函数
的工作
原
理,包括参数校验、字符串复制过程及返回值的意义。并探讨了返回值在实现链式表达式中的作用。
已知
str
cpy
的
函数
原
型:
char
*
str
cpy
(
char
*
str
Des
t, const
char
*
str
Src
)其中
str
Des
t 是目的字符串,
str
Src
是源字符串。不
调用
C++
/C
本文详细解析了C语言中字符串复制
函数
str
cpy
的实现
原
理及
代码
流程。从源字符串到目标字符串的逐字符复制过程,包括对空字符串和相同字符串的处理方式进行了说明。
工具平台和程序库
24,852
社区成员
27,330
社区内容
发帖
与我相关
我的任务
工具平台和程序库
C/C++ 工具平台和程序库
复制链接
扫一扫
分享
社区描述
C/C++ 工具平台和程序库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章