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

辛昕   2018-5-13 15:12 楼主
这是我的实现版本。 https://bbs.eeworld.com.cn/thread-647068-1-1.html 我就不卖关子了。 这次的编程题如下 ()strcpy() { } 说明一下,意思是,返回值 和 形参 也是我们定义的; 同时,函数体我们实现。 要求,什么memcpy strlen就不能用了,否则我还添的什么乱。 要求:考虑函数的稳健性。 几天后我会公布我自己的答案。老规矩,最早答对的,发芯币,除去常见无聊的指针有效性检查。 这个题其实在我看来,真正值得讨论的有2到3个点,因此一个点100个芯币,总共300芯币 本帖最后由 辛昕 于 2018-6-6 10:36 编辑
强者为尊,弱者,死无葬身之地

回复评论 (12)

for循环 +赋值  比较傻的方法
点赞  2018-5-16 08:32
void strcpy(char *s_str , char *d_str , int len)
{
    while(len--)
    {
        *d_str++ = *s_str++;
    }
}
点赞  2018-5-16 08:46
引用: 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版本
强者为尊,弱者,死无葬身之地
点赞  2018-5-16 23:46
引用: 辛昕 发表于 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        //返回复制的有效字符数
}
点赞  2018-5-17 09:45
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;  } 本帖最后由 yang_alex 于 2018-5-17 12:12 编辑
点赞  2018-5-17 12:03
引用: bobde163 发表于 2018-5-17 09:45
那改成这样:
int strcpy(char *s_str , char *d_str)
{
    int char_cnt = 0;
    while(*s_str != ...

GET,然后具体问题,见下面的楼层
强者为尊,弱者,死无葬身之地
点赞  2018-5-19 13:06
引用: 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的,由此会陷入死循环
强者为尊,弱者,死无葬身之地
点赞  2018-5-19 13:07
引用: 辛昕 发表于 2018-5-19 13:07
考虑一种情况。
如果 s_str的位置比d_str小。


s_str < d_str;

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

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

对的。
就是这个意思。
https://bbs.eeworld.com.cn/thread-647068-1-1.html
强者为尊,弱者,死无葬身之地
点赞  2018-6-6 10:36
引用: 辛昕 发表于 2018-6-6 10:36
对的。
就是这个意思。
https://bbs.eeworld.com.cn/thread-647068-1-1.html

你好,不是太清楚这个意思,系统分配空间的话难道不会将d_str所指向的地址分配到字符串s_str的'\0'字符后面吗?
点赞  2018-7-2 20:41
都是大神
点赞  2018-7-3 15:38
引用: tcq1990 发表于 2018-7-2 20:41
你好,不是太清楚这个意思,系统分配空间的话难道不会将d_str所指向的地址分配到字符串s_str的'\0'字符后 ...

使用strcpy并不能假设一定会在两个不同的空间里操作——假如你是两个各自定义的数组,那自然不会出现空间交叠。
但是,你不能假设别人使用strcpy的方式,比如你不能防止别人会在 一个数组的不同位置进行拷贝复制。
强者为尊,弱者,死无葬身之地
点赞  2018-7-4 13:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复