实现字符串复制函数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);
}