strcpy的实现---逆序,不能使用库函数

    实现字符串复制函数void strcyp(char *to,const char *from);,要求不能使用库函数,不能使用其他变量,字符串要求逆序复制.

比如12345,复制应该为54321

问题分析:

       采用方法是,先使from指向字符串末尾,然后从末尾往前复制,到to这样就是逆序的了.

       要实现from指向from,下列循环可以做到.

        while (*(from++));

      循环结束,from指向字符串末尾后一字节.

      实现逆序复制则使用下列语句

while(条件){
    *(to++) = *(from--);
}

      如何设置判断条件呢?

      方法一:,将from[0]设置为0,并将该值保存在to某个位置当中,最坏放置在to的末尾.这个方法违背了from为const这一属性,另外也违背了复制的含义.

      方法二,判断字符串的长度,不能使用其他变量的情况下,这个很难做到.

      方法三,先将to[strlen(from)]处放置哨兵,复制的时候判断*to是否为哨兵,为则说明复制完了.

      方案三可行,不使用strlen()如何设置to[strlen[from]]呢?

      可以将使用from指向字符串末尾的语句改为下面实现

while(*(from++))
        to++;
*to = 哨兵;

选择什么做哨兵呢?当然选择'\0'最恰当,其他值都有可能在字符串中出现.

由于to指向的空间内容未知,可能出现'\0',所以需要将to中其他位置设置为非'\0',简单的就是设置赋值一个非0值,我采用的是赋值*from的值.

while(*(from++))
    *(to++) = *from;
*to = '\0';

如何使to回到原来的位置呢?使用上面的方法,放置哨兵,这次放在开头.

*to = '\0'
while(*(from++))
    *(to++) = *from;
*to = '\0';
while(*(--to));

由于*to为'\0';为了防止,第一次循环就退出,采用do while语句

do{

    * (to++) = *(--from);

}while(*to);

程序最后结构就是

void strcyp(char *char,const char *from){
    *to = '\0';
    while(*(from++))
        *(to++) = *from;
    *to = '0';
   while(*(--to));
   do{ 
       * (to++) = *(--from);
   }while(*to);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值