社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 523|回复: 8

[讨论] 【辛版的小编程题】实现strcpy(总值300芯币)

[复制链接]

7663

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-5-13 15:12:23 | 显示全部楼层 |阅读模式
我就不卖关子了。
这次的编程题如下

()strcpy()
{
}

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

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

几天后我会公布我自己的答案。老规矩,最早答对的,发芯币,除去常见无聊的指针有效性检查。
这个题其实在我看来,真正值得讨论的有2到3个点,因此一个点100个芯币,总共300芯币
此帖出自编程基础论坛
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

6774

TA的帖子

176

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2018-5-16 08:32:01 | 显示全部楼层
for循环 +赋值  比较傻的方法


回复

使用道具 举报

1687

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2018-5-16 08:46:24 | 显示全部楼层
void strcpy(char *s_str , char *d_str , int len)
{
    while(len--)
    {
        *d_str++ = *s_str++;
    }
}

点评

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


回复

使用道具 举报

7663

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-5-16 23:46:04 | 显示全部楼层
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版本

点评

那改成这样: int strcpy(char *s_str , char *d_str) { int char_cnt = 0; while(*s_str != '\0') //把休止符前的字符复制过去 { *d_str++ = *s_str++; char_cnt++  详情 回复 发表于 2018-5-17 09:45
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

1687

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2018-5-17 09:45:32 | 显示全部楼层
辛昕 发表于 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        //返回复制的有效字符数
}

点评

GET,然后具体问题,见下面的楼层  详情 回复 发表于 7 天前


回复

使用道具 举报

860

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2018-5-17 12:03:31 | 显示全部楼层
本帖最后由 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; 
}

点评

考虑一种情况。 如果 s_str的位置比d_str小。 即 s_str < d_str; 你是见不到那个 \0的,由此会陷入死循环  详情 回复 发表于 7 天前


回复

使用道具 举报

7663

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 7 天前 | 显示全部楼层
bobde163 发表于 2018-5-17 09:45
那改成这样:
int strcpy(char *s_str , char *d_str)
{
    int char_cnt = 0;
    while(*s_str != ...

GET,然后具体问题,见下面的楼层
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

7663

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 7 天前 | 显示全部楼层
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的,由此会陷入死循环

点评

这个某种程度上也算是指针有效性检查吧?避免这个问题的一个办法是先找到那个“\0” ,把一个指针指到之后的空间,然后开始复制。但也许后面空间也被其他数据或指针占据,又会出其他问题。  详情 回复 发表于 7 天前
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

860

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 7 天前 | 显示全部楼层
辛昕 发表于 2018-5-19 13:07
考虑一种情况。
如果 s_str的位置比d_str小。


s_str < d_str;

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

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


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-5-26 16:23 , Processed in 0.247246 second(s), 17 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表