4248|12

7815

帖子

56

TA的资源

裸片初长成(中级)

楼主
 

【辛版的小编程题】实现strcpy(总值300芯币) [复制链接]

 
本帖最后由 辛昕 于 2018-6-6 10:36 编辑

这是我的实现版本。
https://bbs.eeworld.com.cn/thread-647068-1-1.html

我就不卖关子了。
这次的编程题如下

()strcpy()
{
}

说明一下,意思是,返回值 和 形参 也是我们定义的;
同时,函数体我们实现。

要求,什么memcpy strlen就不能用了,否则我还添的什么乱。
要求:考虑函数的稳健性。

几天后我会公布我自己的答案。老规矩,最早答对的,发芯币,除去常见无聊的指针有效性检查。
这个题其实在我看来,真正值得讨论的有2到3个点,因此一个点100个芯币,总共300芯币
此帖出自编程基础论坛

最新回复

都是大神  详情 回复 发表于 2018-7-3 15:38
点赞 关注
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

7228

帖子

192

TA的资源

五彩晶圆(高级)

沙发
 
for循环 +赋值  比较傻的方法
此帖出自编程基础论坛
 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

板凳
 
void strcpy(char *s_str , char *d_str , int len)
{
    while(len--)
    {
        *d_str++ = *s_str++;
    }
}
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

4
 
bobde163 发表于 2018-5-16 08:46
void strcpy(char *s_str , char *d_str , int len)
{
    while(len--)
    {
        *d_str++ = *s_ ...

c标准库里,strcpy是没有 len这个参数的
有len的是 strncpy版本
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

5
 
辛昕 发表于 2018-5-16 23:46
c标准库里,strcpy是没有 len这个参数的
有len的是 strncpy版本

那改成这样:
int strcpy(char *s_str , char *d_str)
{
    int char_cnt = 0;
    while(*s_str != '\0')              //把休止符前的字符复制过去
    {
        *d_str++ = *s_str++;
       char_cnt++;
    }
   *d_str = *s_str;         //把休止符复制过去,完成

    return char_cnt        //返回复制的有效字符数
}
此帖出自编程基础论坛
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

6
 
本帖最后由 yang_alex 于 2018-5-17 12:12 编辑

char * strcpy(char * d_str,const char * s_str)
 
{
 
    char * r=d_str;
   
    if((d_str == NULL) || (s_str == NULL))
         return NULL;

    while((*r++ = *s_str++)!='\0');

    return d_str; 
}
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

7
 
bobde163 发表于 2018-5-17 09:45
那改成这样:
int strcpy(char *s_str , char *d_str)
{
    int char_cnt = 0;
    while(*s_str != ...

GET,然后具体问题,见下面的楼层
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

8
 
yang_alex 发表于 2018-5-17 12:03
char * strcpy(char * d_str,const char * s_str)
 
{
 
    char * r=d_str;
   
    if((d_str = ...

考虑一种情况。
如果 s_str的位置比d_str小。


s_str < d_str;

你是见不到那个 \0的,由此会陷入死循环
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

9
 
辛昕 发表于 2018-5-19 13:07
考虑一种情况。
如果 s_str的位置比d_str小。


s_str < d_str;

你是见不到那个 \0的,由此会陷 ...

这个某种程度上也算是指针有效性检查吧?避免这个问题的一个办法是先找到那个“\0” ,把一个指针指到之后的空间,然后开始复制。但也许后面空间也被其他数据或指针占据,又会出其他问题。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

10
 
yang_alex 发表于 2018-5-19 23:19
这个某种程度上也算是指针有效性检查吧?避免这个问题的一个办法是先找到那个“\0” ,把一个指针指到之后 ...

对的。
就是这个意思。
https://bbs.eeworld.com.cn/thread-647068-1-1.html
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

11
 
辛昕 发表于 2018-6-6 10:36
对的。
就是这个意思。
https://bbs.eeworld.com.cn/thread-647068-1-1.html

你好,不是太清楚这个意思,系统分配空间的话难道不会将d_str所指向的地址分配到字符串s_str的'\0'字符后面吗?
此帖出自编程基础论坛
 
 
 

回复

1

帖子

0

TA的资源

禁止发言

12
 
都是大神
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

13
 
tcq1990 发表于 2018-7-2 20:41
你好,不是太清楚这个意思,系统分配空间的话难道不会将d_str所指向的地址分配到字符串s_str的'\0'字符后 ...

使用strcpy并不能假设一定会在两个不同的空间里操作——假如你是两个各自定义的数组,那自然不会出现空间交叠。
但是,你不能假设别人使用strcpy的方式,比如你不能防止别人会在 一个数组的不同位置进行拷贝复制。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表